选择匹配日期

时间:2015-05-25 21:04:57

标签: sql-server

我有一个销售订单表和一个销售订单历史记录表来存储更改。表格如下所示:

(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

如何编写查询以获得此结果?

1 个答案:

答案 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

但有一点需要注意:如果销售订单在历史记录表中没有条目,则查询将不起作用。不确定你是否想要那个。