我有以下表格结构
TransactionDate Item RecQty IssueQty 1-jun-2011 A 10 0 2-jun-2011 A 15 0 3-jun-2011 A 20 0 4-jun-2011 A 0 20 4-jun-2011 A 0 20
我想要特定日期的结果,即2011年6月2日
Item Opening RecQty IssueQty BalanceQty A 10 15 0 25
而在2011年1月4日
Item Opening RecQty IssueQty BalanceQty A 45 0 40 5
我将至少假设使用SQL Server2005。将来,请使用您需要支持的最低版本指定/标记问题。
CREATE TABLE #x ( TransactionDate SMALLDATETIME, Item CHAR(1), RecQty INT, IssueQty INT ); INSERT #x SELECT '20110601','A',10,0 UNION ALL SELECT '20110602','A',15,0 UNION ALL SELECT '20110603','A',20,0 UNION ALL SELECT '20110604','A',0,20 UNION ALL SELECT '20110604','A',0,20; DECLARE @StartDate SMALLDATETIME = '20110601', @Date SMALLDATETIME = '20110602'; WITH x(Item, prevR, prevI, curR, curI) AS ( SELECT Item, SUM(CASE WHEN TransactionDate < @Date THEN RecQty ELSE 0 END), SUM(CASE WHEN TransactionDate < @Date THEN IssueQty ELSE 0 END), SUM(CASE WHEN TransactionDate = @Date THEN RecQty ELSE 0 END), SUM(CASE WHEN TransactionDate = @Date THEN IssueQty ELSE 0 END) FROM #x WHERE TransactionDate BETWEEN @StartDate AND @Date GROUP BY Item ) SELECT Item, Opening = prevR - prevI, RecQty = curR, IssueQty = curI, BalanceQty = (prevR - prevI) + (curR - curI) FROM x; DROP TABLE #x;