2015-05-25 100 views
0

我有一个销售订单表和一个销售订单历史表来存储更改。这些表格看起来像这样:选择匹配日期

(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年12月5日的结果应为:

SO_ID | Old_Quantity | Current_Quantity 
10 | 100   | 150 

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

+0

到目前为止您有什么尝试过吗? – JoelC

+0

我编辑了你的标题。请参阅:“[应该在其标题中包含”标签“](http://meta.stackexchange.com/questions/19190/)”,其中的共识是“不,他们不应该”。 –

+0

@JoelC,使用不同的我能够得到OrderId,但它没有解决我的问题 –

回答

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 

还有一个需要注意的是:如果销售订单没有在历史记录表中的条目的查询将行不通。不知道你是否想要。

+0

解决了我的问题。谢谢 (: –