2016-10-19 8 views
0

データベース管理システムで、問題のクエリを記述する必要があります。 私は4つの問題を抱えています。そのうちの3つを解決し、最後の問題に固執しました。SQLite - nullの場合は0を返します。

詳細:

  • チヌークデータベースhttps://chinookdatabase.codeplex.com/)のバージョン1.4を使用します。チヌークファイルとディレクトリ内
  • SQLiteのDBブラウザ
  • チヌークSqliteをAutoIncrementPKs.sqliteファイルには、私が

問題文に取り組んでいますデータベースです: は、クエリを書きます彼らがサポート担当者であった顧客請求書を介して持ち込まれた金額に基づいて、従業員のランク付けされたリストを生成する。 ID(e_id)、名(e_first名)、姓(e_last_name)、タイトル(すべての従業員をサポートしていないユーザーも含む)の結果セット(下図参照) (e_title)、および請求書合計(total_invoices)を含む。行は、請求書の合計(最大のもの)、次に姓(アルファベット順)、最初の名前(アルファベット順)でソートされます。請求書の合計は、ドル記号($)で始まり、小数点以下2桁(必要に応じて丸められています)でなければなりません。請求書のない従業員の場合は、NULLではなく、$ 0.00を出力する必要があります。 SQLiteのIFNULL、ROUND、およびPRINTF関数を調べると便利です。

所望の出力:

enter image description here

マイクエリ:

Select Employee.EmployeeId as e_id, 
      Employee.FirstName as e_first_name, 
      Employee.LastName as e_last_name, 
      Employee.Title as e_title, 
      '$' || printf("%.2f", Sum(Invoice.Total)) as total_invoices 
From Invoice Inner Join Customer On Customer.CustomerId = Invoice.CustomerId 
        Inner Join Employee On Employee.EmployeeId = Customer.SupportRepId 
Group by Employee.EmployeeId 
Having Invoice.CustomerId in 
(Select Customer.CustomerId From Customer 
Where Customer.SupportRepId in 
     (Select Employee.EmployeeId From Employee Inner Join Customer On Employee.EmployeeId = Customer.SupportRepId) 
) 
order by sum(Invoice.Total) desc 

マイ出力:

enter image description here

ご覧のとおり、最初の3行は正しいですが、従業員に請求書がないためEmployeeIDがnullであるため、後の行は印刷されません。

この状態で行を印刷するにはどうすればよいですか? 私はを試してみました。合体ifnullが機能しますが、動作させることができません。

誰かが私のクエリを修正して一致する解決策を得ることができたら、本当に感謝します。 ありがとう!

P.S:これはチヌークデータベース

enter image description here

答えて

1

のスキーマであることは、多くの場合、サブクエリを使用する方が簡単であることが起こる:

SELECT EmployeeId, 
     FirstMame, 
     LastName, 
     Title, 
     (SELECT printf("...", ifnull(sum(Total), 0)) 
     FROM Invoice 
     JOIN Customer USING (CustomerId) 
     WHERE Customer.SupportRepId = Employee.EmployeeId 
     ) AS total_invoices 
FROM Employee 
ORDER BY total_invoices DESC; 

(内部結合は、あまりにも、サブクエリに置き換えることができます。 )

outer joinsについて学習したことを示すはずですが、一致する行が見つからない場合はNULL値を含む偽の行が生成されます。

... 
FROM Employee 
LEFT JOIN Customer ON Employee.EmployeeId = Customer.SupportRepId 
LEFT JOIN Invoice USING (CustomerID) 
... 

スマートになりたい場合は、ifnull(sum(...), 0)total(...)に置き換えてください。

+0

ありがとうございました。出来た :) – user3397557

関連する問題