sql - 有 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语句并加入它以获得我想要的结果,但我想知道是否有更简单的答案。
解决方案
我会使用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
。
推荐阅读
- c - 如何将具有指数和 sin 函数的方程转换为 C?
- python - Python中从一个坐标系到另一个坐标系的图像转换
- laravel-livewire - Livewire AppServiceProvider 启动方法未在更新时执行
- c# - 为什么大数组可以同步到小数组?
- node.js - 来自 MongoDB 的 React Native fetch 不起作用
- python - 在 Python 上堆叠两个图像以获得单个图像
- javascript - 在“UTS#35”中使用模式编号
- rust - 如何处理“范围内的多个适用项目”错误?
- c - 用空格写一个字符数组
- javascript - 如何获取集合的所有文档的集合的所有文档?