2

このクエリを使用して、各顧客が行った注文数の必要な結果を取得します。ただし、SELECTフィールドでSUM(OrderLine.ActualPrice)を使用し、内部結合を使用して、Orderテーブルを価格を含むOrderLineテーブルにリンクするとします。1つの注文に複数の商品を含めることができるため、OrderLineテーブルには同じ注文の複数のOrderNoが含まれているため、COUNTの結果は歪んでいます。

注文の合計購入額のSUMクエリを入力しながら、このクエリで得られた結果にCOUNTを保持するにはどうすればよいですか?

SELECT C.custno, 
       companyname, 
       Count(customerorder.orderno)AS 'Total Orders', 
FROM   customer C 
       INNER JOIN customerorder 
               ON customerorder.custno = C.custno 
GROUP  BY C.custno, 
          companyname 

誤った結果を伴う修正されたクエリ

SELECT C.custno, 
       companyname, 
       Count(customerorder.orderno)AS 'Total Orders', 
       Sum(orderline.actualprice) 
FROM   customer C 
       INNER JOIN customerorder 
               ON customerorder.custno = C.custno 
       INNER JOIN orderline 
               ON customerorder.orderno = orderline.orderno 
GROUP  BY C.custno, 
          companyname 

これは私が使用しようとしたクエリであり、歪んだCOUNT結果を受け取りました。

4

2 に答える 2

2

2つの基本的なオプションがあります。

DISTINCTを使用する

SELECT C.custno, 
       companyname, 
       Count(DISTINCT customerorder.orderno)AS 'Total Orders', 
       Sum(orderline.actualprice) 
FROM   customer C 
       INNER JOIN customerorder 
               ON customerorder.custno = C.custno 
       INNER JOIN orderline 
               ON customerorder.orderno = orderline.orderno 
GROUP  BY C.custno, 
          companyname 

ノート:

別の質問へのコメントで、あなたはこのスキューがまだ結果であると言います。ordernoこれは、同じことが複数のcustomerorderレコードに表示される可能性があることを意味しているようです。あれは正しいですか?


サブクエリを使用して、結合を1:manyではなく1:1にします。

SELECT C.custno, 
       companyname, 
       Count(customerorder.orderno)AS 'Total Orders', 
       Sum(orderline.actualprice) 
FROM   customer C 
       INNER JOIN customerorder 
               ON customerorder.custno = C.custno 
       INNER JOIN (SELECT orderno, SUM(actualprice) AS actualprice
                     FROM orderline 
                 GROUP BY orderno)
               ON customerorder.orderno = orderline.orderno 
GROUP  BY C.custno, 
          companyname 
于 2012-11-14T11:35:29.747 に答える
1

これを試して

SELECT C.custno, 
       companyname, 
       Count(Distinct customerorder.orderno)AS 'Total Orders', 
       Sum(orderline.actualprice) 
FROM   customer C 
       INNER JOIN customerorder 
               ON customerorder.custno = C.custno 
       INNER JOIN orderline 
               ON customerorder.orderno = orderline.orderno 
GROUP  BY C.custno, 
          companyname

DISTINCT注文番号のカウントを使用

于 2012-11-14T11:33:37.737 に答える