首页 > 解决方案 > 有 CASE 语句时,ROLLUP 行无法正确求和

问题描述

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

标签: sqlsql-servertsql

解决方案


我会使用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


推荐阅读