有CASE语句时ROLLUP行未正确求和

时间:2018-08-08 16:35:29

标签: sql sql-server tsql

我正在尝试编写一份报告,说明我已经完成了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语句,然后加入它以获得我想要的结果,但是我想知道是否有一个更简单的答案。

1 个答案:

答案 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并不需要显示。