I have the following table strucature
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
And I want the result on specific Date i.e 2-jun-2011
Item Opening RecQty IssueQty Balance开发者_JAVA技巧Qty
A 10 15 0 25
And on 4-Jan-2011
Item Opening RecQty IssueQty BalanceQty
A 45 0 40 5
I'm going to assume at least SQL Server 2005. In the future, please specify/tag the question with the minimum version you need to support.
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;
精彩评论