2017-05-07 7 views
-1

最大数のアイテムを注文した顧客のリストを返す必要があります。私は以下を追加していくつかの結果を得ましたが、複数の最大値を表示するためにクエリをフィルタリングする必要があります。DBMS - Oracle |複数のテーブル/リレーションの複数の最大値を返す

私は、次のDML書かれている

CREATE TABLE Customer 
(Cust_Num NUMBER(4) PRIMARY KEY, 
Cust_LName VARCHAR2(10), 
Cust_FName VARCHAR2(10), 
Cust_Address VARCHAR2(20), 
Cust_City VARCHAR2(12), 
Cust_State VARCHAR2(2), 
Cust_Zip VARCHAR2(5), 
Cust_Referred NUMBER(4)); 

Create Table BookOrder 
(BO_OrderNum NUMBER(4) PRIMARY KEY, 
BO_CustNum NUMBER(4) REFERENCES Customer(Cust_Num), 
BO_OrderDate DATE, 
BO_ShipDate DATE, 
BO_ShipStreet VARCHAR2(18), 
BO_ShipCity VARCHAR2(15), 
BO_ShipState VARCHAR2(2), 
BO_ShipZip VARCHAR2(5)); 

CREATE TABLE BookOrderItem 
(BOI_OrderNum NUMBER(4) NOT NULL REFERENCES BookOrder(BO_OrderNum), 
BOI_ItemNum NUMBER(2) NOT NULL, 
BOI_ISBN VARCHAR2(10) REFERENCES Book(Book_ISBN), 
BOI_Qty NUMBER(3), 
CONSTRAINT bookorderitem_pk PRIMARY KEY (BOI_OrderNum, BOI_ItemNum)); 

DDL:私の次の結果を与える

SELECT C.CUST_LNAME, C.CUST_FNAME, BO.BO_CUSTNUM, BOI.BOI_ORDERNUM, 
COUNT(BOI.BOI_ITEMNUM) AS Total_Items_Per_Order 
FROM BookOrderItem BOI JOIN BookOrder BO ON BOI.BOI_OrderNum = BO.BO_OrderNum 
JOIN Customer C ON C.Cust_Num = BO.BO_CustNum 
GROUP BY C.Cust_LName, C.CUST_FName, BO.BO_CustNum, BOI.BOI_OrderNum 
ORDER BY Total_Item_Per_Order DESC; 

...このスクリーンショットを1として

+------------+------------+------------+--------------+-----------------------+ 
| CUST_LNAME | CUST_FNAME | BO_CustNum | BOI_OrderNum | TOTAL_ITEMS_PER_ORDER | 
+------------+------------+------------+--------------+-----------------------+ 
| NELSON  | BECCA  | 1017  | 1012   | 4      | 
| GIANA  | TAMMY  | 1007  | 1007   | 4      | 
| MORALES | BONITA  | 1001  | 1003   | 3      | 
| MORALES | BONITA  | 1001  | 1018   | 2      | 
| LUCAS  | JAKE  | 1010  | 1001   | 2      | 
| GIRARD  | CINDY  | 1005  | 1009   | 2      | 
| LEE  | JASMINE | 1014  | 1013   | 1      | 
| MONTIASA | GREG  | 1018  | 1005   | 1      | 
| MONTIASA | GREG  | 1018  | 1019   | 1      | 
| PIERSON | THOMAS  | 1004  | 1008   | 1      | 
| JONES  | KENNETH | 1008  | 1020   | 1      | 
| MCGOVERN | REESE  | 1011  | 1002   | 1      | 
| LUCAS  | JAKE  | 1010  | 1011   | 1      | 
| FALAH  | KENNETH | 1020  | 1015   | 1      | 
| SMITH  | JENNIFER | 1019  | 1010   | 1      | 
| GIRARD  | CINDY  | 1005  | 1000   | 1      | 
| SMITH  | LEILA  | 1003  | 1006   | 1      | 
| GIANA  | TAMMY  | 1007  | 1014   | 1      | 
| FALAH  | KENNETH | 1020  | 1004   | 1      | 
| SMITH  | LEILA  | 1003  | 1016   | 1      | 
| SCHELL  | STEVE  | 1015  | 1017   | 1      | 
+------------+------------+------------+--------------+-----------------------+ 

...

+1

、質問内の形式のテキストとしてではなく、リンクされた画像として出力を再現してください。これは、リンクされた画像にナビゲートすることは少し不便であり、リンクは時間の経過とともに壊れる可能性があるからです。質問に画像を含める必要がある場合、 '[] [1]'を使用するとリンクとしてではなく質問に表示することができます。 ''画像の説明を入力する必要はないが、依然として括弧が必要なので、ここで '[] 'を使用しています。複数のイメージを使用している場合は、イメージの番号に '1 'を変更してください。 – toonice

+0

サンプルデータと期待される出力を与えます。 – Utsav

+0

理想的には、注文番号ごとに最大量のアイテムを含む行を返す必要があります。 2つの注文番号の項目数が同じ場合、両方の行が返されます。 –

答えて

0

次...

SELECT Cust_LName, 
     Cust_FName, 
     Cust_Num AS Cust_Num, 
     BO_OrderNum AS Order_Num, 
     BOI_ItemNum AS Item_Num, 
     Max_Qty_Per_Order AS Max_Qty_Per_Order 
FROM (SELECT BOI_OrderNum AS Order_Num, 
       MAX(BOI_Qty) AS Max_Qty_Per_Order 
     FROM BookOrderItem 
     GROUP BY BOI_OrderNum 
    ) Max_Qty_Per_Order_Finder 
JOIN BookOrderItem ON BookOrderItem.BOI_OrderNum = Max_Qty_Per_Order_Finder.Order_Num 
        AND BookOrderItem.BOI_Qty = Max_Qty_Per_Order_Finder.Max_Qty_Per_Order 
JOIN BookOrder ON Max_Qty_Per_Order_Finder.Order_Num = BookOrder.BO_OrderNum 
JOIN Customer Customer ON Customer.Cust_Num = BookOrder.BO_CustNum 
ORDER BY Max_Qty_Per_Order DESC, 
     BO_OrderNum, 
     BOI_Item_Num; 

この文は、注文番号とそれぞれに関連するBOI_Qtyの最大値のリストを作成することによって開始してみてください。このサブクエリの

結果は彼らのBookOrderためBOI_Qtyの最大値を持つBookOrderItemからのレコードだけが返されるようにBookOrderItemに結合されます。特定のBookOrderの1つ以上のBookOrderItemが、そのBookOrderの最大値がBOI_Qtyの場合、そのような各レコードは保持されます。

BookOrder

そのためBO_CustNumの値を取得することができ、検索される各BookOrder関連付けられCustomerNameを可能にする、Customerにデータセットを結合するために使用されるように得られたデータセットは、その後BookOrderに接合されています

最後のデータセットの各レコードの目的のフィールドが取得され、ソートされます。

BOI_Qtyの最大値を返すように尋ねたので、選択したフィールドにフィールドBOI_ItemNumを含めました。それがなければ、そのような記録は繰り返されるように見えます。 BOI_ItemNumを含めると、返された各レコードを識別できます。

ご不明な点がございましたら、お気軽にコメントを投稿してください。

1

最初の行のみを保持するには、Oracle 12cでFETCH FIRST n ROW(s) ONLYを使用します。ネクタイを検討するために、あなたはWITH TIESONLYを交換したい:あなたの質問の質を向上させるために

... 
ORDER BY Total_Item_Per_Order DESC 
FETCH FIRST 1 ROW WITH TIES; 
関連する問題