2017-06-15 19 views
1

質問:各顧客の名前、注文した注文の数、注文したピザの数は?ここで集計SQLクエリ

enter image description here

私が持っているものです。

SELECT DISTINCT FirstName, LastName, Count(Orders.ID) AS NumberOfOrders, Count(Pizza.ID) AS NumberOfPizzas 
FROM ((Customer LEFT OUTER JOIN Orders ON Customer.ID = Orders.CustomerID) LEFT OUTER JOIN Pizza ON Orders.ID = Pizza.OrderID) GROUP BY Customer.ID; 

これは、それが印刷さです:

enter image description here

注文数が間違っている、それは1-0でなければなりません-2-1。

"Orders.ID = Pizza.OrderID"から "Pizza.OrderID = Orders.ID"に変更すると、両方の列のピザの数ではなく、両方の列の注文数が印刷されます。

これを修正するにはどうすればよいですか? count(distinct orders.id)あなたはクラスや学習を取っているので、私はあなたのためにいくつかの余分なフィードバックを持っているように見えます

+0

画像は使用しないでください。その資料を質問にコピーし、「コード」としてフォーマットします。プレビューを無視して、資料を質問にコピーします。正しく表示され、タブが含まれていないことを確認してください。それを選択し、編集ボックスの上の** '{}' **ボタンでインデントします。今プレビューを見て、まだOKであることを確認してください。もしあなたが好きなら、 '<! - language:lang-none - > 'を含む字下げのない行を例の前にそれ自身で追加することができます。あなたのスクリーンショットは、少なくとも私のような古美術の目にはほとんど判りません。 –

答えて

0

変更に。まず、テーブルを結合する場合は、選択した各フィールドが1つのテーブルで一意であっても、完全修飾することをお勧めします(FirstNamec.FirstNameになります)。コードを自己文書化するのに役立ちます。

第2に、同じことを意味しない場合、複数のテーブルに同じ名前のフィールドを持つことは慣習ではありません。具体的には、Customer.IDCustomer.CustomerIDであり、Order.IDOrder.OrderIDである必要があります。繰り返しますが、これは自分のクエリだけでなく、後でそれらのテーブルを使用する必要があるすべての開発者にも自己文書化に役立ちます。 IDフィールドが何を表しているのかがはっきりしています。

ジョイン(少なくともMySQLでは)すべてをカッコで囲む必要はありません。そうしないと、入力ミスを招き、あなたや他の人が読むのが難しくなります。

最後に、99%のケースでは、最終的な製品では決してORDER BY句を使用する必要があります。プログラムを使用して結果を返すことは決してできないからです。ユーザーに論理的なものを選択してください。この場合、LastNameとFirstNameのソートはかなり直感的です。ユーザーに迷惑をかけることはしないでください!

ここで、あなたの特定の問題に、それはかなり簡単です。クエリにCOUNT(DISTINCT ...)を使用する必要があります。上記のすべてを考慮に入れて、私はあなたの質問を並べ替えて、読みやすさを向上させました。私はこれが助けて欲しい!

SELECT c.FirstName, c.LastName, COUNT(DISTINCT o.id) AS NumberOfOrders, 
    COUNT(p.ID) AS NumberOfPizzas 
FROM Customer c 
    LEFT JOIN Order o ON o.CustomerID = c.ID 
    LEFT JOIN Pizza p ON p.OrderID = o.ID 
GROUP BY c.ID 
ORDER BY c.LastName, c.FirstName