2013-01-06 18 views
2

我一直在努力使用SQL Server查询一段时间,并意识到我必须从知道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 

我得到每个SUPPL_ORDERNOOUR_ORDER组合的多个CUST_INVOICE但我只想要回最新的CUST_INVOICE(=最大的发票号码)。

这是我想要返回的结果:

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

摘要:

  1. 如果有超过一(1)CUST_INVOICE因为我只想展现SUPPL_ORDERNOOUR_ORDER组合CUST_INVOICE与最大数
  2. 如果没有OUR_ORDER和否CUST_INVOICE我希望它显示为空
  3. ,如果有一个OUR_ORDER没有CUST_INVOICE我想它显示为空

任何帮助,将不胜感激!

回答

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”的值,它用于过滤。

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