测试数据不全啊,从测试数据看不出怎么得出那个结果,你先解释下:Opening IN IN_Retrun OUT OUT_Return 这些分别是什么?
解决方案 »
- 触发器的参数怎么传不进去啊?
- 请教一下,工资如何设置一个计算规则,比如每月都可以设置工资的公式,然后按公式计算,我不知如何实现。
- 排序问题
- 要實現動態的參數表,如何在SQL Server上建表啊?
- 关于触发器的问题,update一个单元格,如果update的值和原有的记录有重复出提示,啥办?
- sql查询 按一个字段分组查询出跟这个字段有关的其他信息
- SQL Server 2000中的合并复制的疑问?
- 关于触发器的难题~
- 请问各位都是怎么解决并发问题呢(sql server)
- 如何编写一个每天每小时都执行的job
- 我想手动更新一个表里的一个timestamp类型的数据为15年12月31该怎么办呢
- union all不能将数据合并
SELECT Item,CONVERT(VARCHAR(7),Date,120)Date
,ISNULL(SUM(CASE WHEN Flag>0 AND Quantity>=0 THEN Quantity END),0)[IN]
,ABS(ISNULL(SUM(CASE WHEN Flag>0 AND Quantity<0 THEN Quantity END),0))[IN_Retrun]
,ISNULL(SUM(CASE WHEN Flag<=0 AND Quantity>=0 THEN Quantity END),0)[OUT]
,ABS(ISNULL(SUM(CASE WHEN Flag<=0 AND Quantity<0 THEN Quantity END),0))[OUT_Return]
FROM TB
GROUP BY Item,CONVERT(VARCHAR(7),Date,120)
)
,CTE2 AS(
SELECT T1.Item,T1.[Date],T1.[IN],T1.[IN_Retrun],T1.[OUT],T1.[OUT_Return]
,SUM(CASE WHEN T1.Date=T2.Date THEN 0
ELSE T2.[IN]-T2.[IN_Retrun]-T2.[OUT]+T2.[OUT_Return]
END)Opening
,SUM(T2.[IN]-T2.[IN_Retrun]-T2.[OUT]+T2.[OUT_Return])Balance
FROM CTE T1
JOIN CTE T2 ON T1.Item=T2.Item AND T1.Date>=T2.Date
GROUP BY T1.Item,T1.[Date],T1.[IN],T1.[IN_Retrun],T1.[OUT],T1.[OUT_Return]
)
SELECT T1.Item,T1.Date,T1.Opening+ISNULL(T2.Balance,0) Opening
,T1.[IN],T1.[IN_Retrun],T1.[OUT],T1.[OUT_Return]
,T1.Balance+ISNULL(T2.Balance,0) Balance
FROM CTE2 T1
LEFT JOIN Stocks T2 ON T1.Item=T2.Item
WHERE T1.Date>='2005-01'--按月时间条件放在这
ORDER BY Item,Date
/*--结果
Item Date Opening IN IN_Retrun OUT OUT_Return Balance
---------- ---------------- -------------- ----------- ---------------- ----------- ------------------- -----------
aa 2005-02 225 200 10 0 5 420
bb 2005-02 0 195 15 65 20 135
cc 2005-02 100 0 0 0 0 100
aa 2005-03 420 0 10 0 0 410
--*/
,MIN(Opening)Opening
,ISNULL(SUM(CASE WHEN Flag>0 AND Quantity>=0 THEN Quantity END),0)[IN]
,ABS(ISNULL(SUM(CASE WHEN Flag>0 AND Quantity<0 THEN Quantity END),0))[IN_Retrun]
,ISNULL(SUM(CASE WHEN Flag<=0 AND Quantity>=0 THEN Quantity END),0)[OUT]
,ABS(ISNULL(SUM(CASE WHEN Flag<=0 AND Quantity<0 THEN Quantity END),0))[OUT_Return]
,MAX(Balance)Balance
FROM (
SELECT T1.ID,T1.Item,T1.Date,T1.Flag,T1.Quantity
,ISNULL(T3.Balance,0)+SUM(CASE WHEN T1.ID=T2.ID THEN 0 WHEN T2.Flag>0 THEN T2.Quantity ELSE -T2.Quantity END)Opening
,ISNULL(T3.Balance,0)+SUM(CASE WHEN T2.Flag>0 THEN T2.Quantity ELSE -T2.Quantity END)Balance
FROM TB T1
JOIN TB T2 ON T1.Item=T2.Item AND(T1.Date>T2.Date OR(T1.Date=T2.Date AND T1.ID>=T2.ID))
LEFT JOIN Stocks T3 ON T1.Item=T3.Item
GROUP BY T1.ID,T1.Item,T1.Date,T1.Flag,T1.Quantity,T3.Balance
)T
--WHERE Date>='2005-01-01'时间条件放在此处
GROUP BY Item,CONVERT(VARCHAR(7),Date,120)
ORDER BY Item,Date