1

わかりました私は以下のコードを持っています

SELECT PO_NUMBER, MIN(PO_QUANTITY) AS PO_QUANTITY, SUM(COALESCE(SHIPPED_WT, 0)) AS SHIPPED_WT  
FROM VW_TRAFFIC_PO_SIDE
WHERE SYSDATE > PO_SHIPMENT_TO
GROUP BY PO_NUMBER
HAVING MIN(PO_QUANTITY) > SUM(COALESCE(SHIPPED_WT, 0))

これは、適切なデータを取得するという点で私が望むすべてを行いますが、次の行に沿って、より多くの列が必要です

SELECT PO_NUMBER, SO_ORIGIN, SO_PRODUCT, SUPPLIER, MIN(PO_QUANTITY) AS PO_QUANTITY, SUM(COALESCE(SHIPPED_WT, 0)) AS SHIPPED_WT, PO_SHIPMENT_FROM, PO_SHIPMENT_TO  
FROM VW_TRAFFIC_PO_SIDE
WHERE SYSDATE > PO_SHIPMENT_TO
GROUP BY PO_NUMBER
HAVING MIN(PO_QUANTITY) > SUM(COALESCE(SHIPPED_WT, 0))

ただし、不要なデータを取得するため、他の列でグループ化することはできません。

何か案は?

Distinct を使用できることはわかっていますが、データを表示したい方法では、削除したくないレコードが削除されます

PS、私はSQLサーバーを使用しています。テーブルを作成/変更できません。使用するすべてのデータはビューに基づいており、それを変更することもできません

編集:私は答えを提供しましたが、エレガントではありません

PO          PO Qty                  Tracking No        Shipped Qty

PO 1       100                         1                              60            
PO 1       100                         1                              60
PO 1       100                         1                              60
PO 1       100                         2                              15
PO 1       100                         2                              15

PO 2       50                          2                              20    
PO 2       50                          2                              20    
PO 2       50                          3                              30 
PO 2       50                          3                              30



IN the above scenario, totals are

                                PO 1       PO 2

PO Qty                          100         50

Shipped                         75          50          

Unshipped                       25           0         



-          In each PO record, the PO qty is stated in full on each line and therefore is repeated each time the same PO is listed as a record

-          Within a tracking no for the PO, the shipped quantity is stated in full and therefore is repeated each time the same tracking no (for the same PO #) is listed as a record

-          So a tracking number can exist on two different PO’s (as in Tracking no 2 above) in which case the value is counted once for each PO
4

3 に答える 3

0
    SELECT PO_NUMBER, PO_QUANTITY, SHIPPED_WT, PO_SHIPMENT_TO, SO_ORIGIN, SO_PRODUCT, SUPPLIER, PO_QUANTITY-SHIPPED_WT UNSHIPPED 
    FROM (
    SELECT DISTINCT PO_NUMBER, PO_QUANTITY, PO_SHIPMENT_TO, SO_ORIGIN, SO_PRODUCT, SUPPLIER,  SUM(NVL(SHIPPED_WT,0)) OVER (PARTITION BY PO_NUMBER) AS SHIPPED_WT 
    FROM(
    SELECT DISTINCT PO_NUMBER,  PO_TRACKING_NO, PO_QUANTITY, SHIPPED_WT, PO_SHIPMENT_TO, SO_PRODUCT, SO_ORIGIN, SUPPLIER FROM VW_TRAFFIC_PO_SIDE)) 

WHERE PO_QUANTITY > SHIPPED_WT AND SYSDATE > PO_SHIPMENT_TO 

多くの時間と多大な努力の後、私の会社は最終的に私を助けるために2人目の人を割り当てることができました..それは少し非効率的です

于 2013-01-09T08:11:25.967 に答える
0

A JOINはいかがですか?

SELECT DISTINCT X.PO_NUMBER, X.PO_QUANTITY, X.SHIPPED_WT,
Y.SO_ORIGIN, Y.SO_PRODUCT, Y.SUPPLIER, 
Y.PO_SHIPMENT_FROM, Y.PO_SHIPMENT_TO  
FROM (
     SELECT PO_NUMBER, MIN(PO_QUANTITY) AS PO_QUANTITY, 
     SUM(COALESCE(SHIPPED_WT, 0)) AS SHIPPED_WT 
     FROM VW_TRAFFIC_PO_SIDE
     WHERE SYSDATE > PO_SHIPMENT_TO
     GROUP BY PO_NUMBER
     HAVING MIN(PO_QUANTITY) > SUM(COALESCE(SHIPPED_WT, 0))) X
     LEFT JOIN VW_TRAFFIC_PO_SIDE Y
     ON X.PO_NUMBER = Y.PO_NUMBER
     ;

以下は古いデータに基づくデモです...必要なすべての行が含まれているわけではありませんが、他の行を追加することでも機能するはずです。

于 2013-01-09T05:23:04.513 に答える
0

答えてください: GROUP BY PO_NUMBER1 つのグループ内のすべての項目が同じSO_ORIGIN, SO_PRODUCT, SUPPLIER, PO_SHIPMENT_FROM, PO_SHIPMENT_TOですか? 答えが「はい」の場合、クエリを次のように変更できます。

 GROUP BY PO_NUMBER, SO_ORIGIN, SO_PRODUCT, SUPPLIER, PO_SHIPMENT_FROM, PO_SHIPMENT_TO

答えが「いいえ」の場合、クエリは論理的に間違っています。

于 2013-01-09T05:23:26.323 に答える