我已经在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_INVOICE
和SUPPL_ORDERNO
组合获得了多个OUR_ORDER
,但我只想返回最新的CUST_INVOICE
(=最大发票号)。
这是我想要返回的结果:
SUPPL_ORDERNO OUR_ORDER CUST_INVOICE
------------------------------ --------- ------------
143914 64228 180148
326042
326052 64549 180219
326086 64633
要点:
CUST_INVOICE
和SUPPL_ORDERNO
的组合有多个(1)OUR_ORDER
,我只想显示数字最大的CUST_INVOICE
OUR_ORDER
且没有CUST_INVOICE
我希望它显示为空OUR_ORDER
且没有CUST_INVOICE
我希望它显示为空任何帮助将不胜感激!
答案 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
上的简单示例
答案 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”,用于过滤器。