我正在尝试编写一份报告,说明我已经完成了99%的工作,但其中一列无法正确汇总汇总。我相信我在下面复制了一个简单的版本:
代码
DECLARE @table TABLE (
id VARCHAR(10)
,number1 MONEY
,number2 MONEY
)
INSERT INTO @table (
id
,number1
,number2
) VALUES (
1
,10
,200
)
INSERT INTO @table (
id
,number1
,number2
) VALUES (
2
,100
,20
)
SELECT
CASE WHEN GROUPING(id) = 1
THEN 'Total'
ELSE id
END as ID
,CASE
WHEN SUM(number1) > SUM(number2)
THEN SUM(number1)
ELSE SUM(number2)
END as GreaterNum
,GROUPING(id) as idgroup
FROM @table
GROUP BY id WITH ROLLUP
我的预期结果将是TOTAL行将两个大数之和(100 + 200)相加,因此= 300
执行结果
ID | GreaterNum | IDGroup
1 200 0
2 100 0
TOTAL 300 1
然而,它所做的只是将TOTAL汇总行中的number2相加
实际结果
ID | GreaterNum | IDGroup
1 200 0
2 100 0
TOTAL 220 1
我想我要做的是事先创建另一个临时表,并在其中做case语句,然后加入它以获得我想要的结果,但是我想知道是否有一个更简单的答案。
答案 0 :(得分:2)
我会使用APPLY
:
SELECT ISNULL(id, 'Total') Id, SUM(GreaterNum) GreaterNum
FROM @table t CROSS APPLY
( VALUES (CASE WHEN number1 > number2 THEN number1 ELSE number2
END)
) tt(GreaterNum)
GROUP BY id WITH ROLLUP;
但是,我只是拒绝了GROUPING()
,而实际上Total
并不需要显示。