我想在下表中根据借方和贷方amt进行总计金额的计算,有一列drcr,其中“ c”代表贷方,“ d”代表借方,也应使用分组名称来完成。
我想使用SQL Server查询以下输出
Name amt drcr Total
| 'abc'| 1| 'c'|1 |
| 'abc'| 5| 'd'|-4|
| 'abc'| 2| 'c'|-2|
| 'abc'| 1| 'c'|-1|
| 'bcd'| 1| 'c'|15|
| 'bcd'| 1| 'd'|0 |
| 'bcd'| 5| 'c'|5 |
| 'bcd'| 8| 'd'|-3|
| 'bcd'| 0| 'c'|-3|
从以下输入
CREATE TABLE #temp
(
intId INT IDENTITY(1, 1) ,
varName VARCHAR(50) ,
decAmt DECIMAL(28, 0) ,
charCrDr CHAR(1) , -- c cr, d dr
decTotal DECIMAL(28, 0)
)
INSERT INTO #temp
( varName, decAmt, charCrDr )
VALUES ( 'abc', 1, 'c' ),
( 'abc', 5, 'd' ),
( 'abc', 2, 'c' ),
( 'abc', 1, 'c' ),
( 'bcd', 15, 'c' ),
( 'bcd', 15, 'd' ),
( 'bcd', 5, 'c' ),
( 'bcd', 8, 'd' ),
( 'bcd', 0, 'c' )
我已经使用以下解决方案解决了
SELECT *
INTO #temp1
FROM #temp AS T
UPDATE #temp1
SET #temp1.intAmt = CAST(-#temp1.decAmt AS DECIMAL)
WHERE charCrDr = 'd'
SELECT T.intId ,
T.varName ,
T.charCrDr ,
T.decAmt ,
SUM(T2.decAmt) AS balance
FROM #temp1 AS T
INNER JOIN #temp1 AS T2 ON T2.varName = T.varName
AND T2.intId <= T.intId
GROUP BY T.intId ,
T.varName ,
T.charCrDr ,
T.decAmt
但是我想最好的方法是什么
感谢你
试试这个:(已改进)
SELECT intId, varName, decAmt, charCrDr,
SUM(CASE WHEN charCrDr = 'c' THEN
decAmt
ELSE
decAmt * -1
END )
OVER (PARTITION BY varName ORDER BY intId) As decTotal
FROM #Temp;
说明:
CASE
会决定是否给decAmt添加为正数或负数的SUM
。PARTITION BY
方法的总和将每个varName的单独计算(这是在对方的回答丢失)ORDER BY
可以确保总和计算正确这将适用于任何受支持的Sql Server版本(2005及更高版本)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句