从SQL Server加入获取最大值

时间:2013-01-06 21:47:52

标签: sql sql-server sql-server-2008 join

我已经在SQL Server查询上挣扎了一段时间,并意识到我必须得到比我更了解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_INVOICESUPPL_ORDERNO组合获得了多个OUR_ORDER,但我只想返回最新的CUST_INVOICE(=最大发票号)。

这是我想要返回的结果:

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

要点:

  1. 如果CUST_INVOICESUPPL_ORDERNO的组合有多个(1)OUR_ORDER,我只想显示数字最大的CUST_INVOICE
  2. 如果没有OUR_ORDER且没有CUST_INVOICE我希望它显示为空
  3. 如果有OUR_ORDER且没有CUST_INVOICE我希望它显示为空
  4. 任何帮助将不胜感激!

2 个答案:

答案 0 :(得分:2)

从GROUP BY中删除t3.CUST_INVOICE并使用MAX(t3.CUST_INVOICE)函数进入SELECT语句

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

上的简单示例

答案 1 :(得分: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”,用于过滤器。