2

私はしばらくの間SQLServerクエリに苦労してきましたが、SQL Serverを(はるかに)よく知っている人から助けを得る必要があることに気づきました。

環境:SQL Server 2008

SELECT      
    t1.SUPPL_ORDERNO, 
    t2.OUR_ORDER,
    t3.CUST_INVOICE
FROM t1 

    LEFT OUTER JOIN t2 
        ON t1.SUPPL_ORDERNO = t2.ORDER_REM5 

    LEFT OUTER JOIN t3
        ON t2.ORDER_REM5  = t3.INV_REM5

GROUP BY t1.SUPPL_ORDERNO, t2.OUR_ORDER, t3.CUST_INVOICE
ORDER BY t1.SUPPL_ORDERNO,t3.CUST_INVOICE

これは、上記のクエリで得られた結果です。

SUPPL_ORDERNO                  OUR_ORDER CUST_INVOICE
------------------------------ --------- ------------
143914                         64228     179890
143914                         64228     179935
143914                         64228     179995
143914                         64228     179999
143914                         64228     180067
143914                         64228     180148
326042                                   
326052                         64549     180219
326086                         64633  

CUST_INVOICEそれぞれSUPPL_ORDERNOと組み合わせに対して複数を取得しますが、最新の(=最大の請求書番号)OUR_ORDERのみを返したいです。CUST_INVOICE

これは私が返したい結果です:

SUPPL_ORDERNO                  OUR_ORDER CUST_INVOICE
------------------------------ --------- ------------
143914                         64228     180148
326042                                   
326052                         64549     180219
326086                         64633   

概要:

  1. CUST_INVOICEの組み合わせが複数あり、最大数のを表示SUPPL_ORDERNOOUR_ORDERたい場合CUST_INVOICE
  2. ない場合とない場合はOUR_ORDERCUST_INVOICEとして表示したい
  3. ある場合OUR_ORDERとない場合はCUST_INVOICE空として表示したい

どんな助けでもいただければ幸いです!

4

2 に答える 2

2

GROUP BYからt3.CUST_INVOICEを削除し、SELECTステートメントでMAX(t3.CUST_INVOICE)関数を使用します

SELECT t1.SUPPL_ORDERNO, t2.OUR_ORDER, MAX(t3.CUST_INVOICE) AS CUST_INVOICE
FROM t1 LEFT JOIN t2 ON t1.SUPPL_ORDERNO = t2.ORDER_REM5 
        LEFT JOIN t3 ON t2.ORDER_REM5  = t3.INV_REM5
GROUP BY t1.SUPPL_ORDERNO, t2.OUR_ORDER
ORDER BY t1.SUPPL_ORDERNO, t3.CUST_INVOICE

SQLFiddleの簡単な例

于 2013-01-07T23:42:59.097 に答える
1

これにアプローチする最良の方法は、を使用することrow_number()です。これにより、シーケンス番号が追加されます。この場合は、各注文内の請求書番号によって追加されます。

select suppl_orderno, our_order, cust_invoice
from (SELECT t1.SUPPL_ORDERNO, t2.OUR_ORDER, t3.CUST_INVOICE,
             row_number() over (partition by t1.SUPPL_ORDERNO, t2.OUR_ORDER order by t3.cust_invoice desc) as seqnum
      FROM t1 LEFT OUTER JOIN
           t2 
           ON t1.SUPPL_ORDERNO = t2.ORDER_REM5 LEFT OUTER JOIN
           t3
           ON t2.ORDER_REM5  = t3.INV_REM5
     ) t
where seqnum - 1
ORDER BY SUPPL_ORDERNO,CUST_INVOICE

請求書を降順で並べ替えると、最新の値は「1」になり、これがフィルターに使用されます。

于 2013-01-06T22:01:36.877 に答える