我有一个销售订单表和一个销售订单历史记录表来存储更改。表格如下所示:
(Sales Order)
SO_ID | OrderName | Quantity
10 | Order A | 150
20 | Order B | 150
(Sales Order History)
ID | SO_ID | Quantity | Change_Date
1 | 10 | 100 | 10/05/2015
2 | 20 | 50 | 13/05/2015
3 | 10 | 500 | 17/05/2015
4 | 20 | 200 | 23/05/2015
现在,我想创建一个报告,以显示特定日期的数量。例如,对于SO_ID 10,2015年5月12日的结果应为:
SO_ID | Old_Quantity | Current_Quantity
10 | 100 | 150
如何编写查询以获得此结果?
答案 0 :(得分:1)
CTE很容易。这将在SalesOrderHistory
表中找到参考日期的最后一个条目:
DECLARE @refDate date = '12/05/2015'
;WITH cte AS
(
SELECT s.SO_ID,
Old_Quantity = h.Quantity,
Current_Quantity = s.Quantity,
rowNumber = row_number() over (partition by s.SO_ID order by Change_Date DESC)
FROM SalesOrder s
INNER JOIN SalesOrderHistory h ON s.SO_ID = h.SO_ID
WHERE h.Change_Date <= @refDate
)
SELECT *
FROM cte
WHERE rowNumber = 1
但有一点需要注意:如果销售订单在历史记录表中没有条目,则查询将不起作用。不确定你是否想要那个。