sql - Postgres ROLLUP中如何区分真正的NULL和正式的NULL?
问题描述
我正在尝试确定每个给定行所属的 ROLLUP 报告的“级别”。当初始数据不包含空值时,可以只计算每一行中的空值(对于每个给定的分组级别/层,空单元格的数量是相同的),尽管它在我看来也不是一个漂亮的解决方案。
如果初始数据包含 NULL,则此解决方法不再有效:在示例查询结果表中,您会看到它<null>
来自真正的 null,并且(null)
是分组单元格的标准 NULL 占位符。
我希望找到类似于“分层查询中的虚拟列(如LEVEL
,PATH
等)的内容。
PostgreSQL v12 中是否有一种自然的方法来确定使用ROLLUP
(通常使用GROUPING SETS
)构建的报告中的行级别?
ROLLUP 查询结果示例:
select a, b, sum(d.c)
from(
select null as a, 2 as b, 1 as c
union all
select null as a, 3 as b, 1 as c
union all
select 'a1' as a, 4 as b, 1 as c
union all
select 'a1' as a, 5 as b, 1 as c
union all
select 'a2' as a, 6 as b, 1 as c
) d GROUP by ROLLUP (d.a, d.b)
| a | b | sum |
--------------------------
| (null) | (null) | 5 |
| a1 | 5 | 1 |
| <null> | 2 | 1 |
| a1 | 4 | 1 |
| a2 | 6 | 1 |
| <null> | 3 | 1 |
| a2 | (null) | 1 |
| <null> | (null) | 2 |
| a1 | (null) | 2 |
--------------------------
解决方案
使用分组,一种
select case when grouping(a) = 1 then 'Total' else cast(a as varchar(20)) end a,
case when grouping(b) = 1 then 'Total' else cast(b as varchar(20)) end b, sum(d.c)
from(
select null as a, 2 as b, 1 as c
union all
select null as a, 3 as b, 1 as c
union all
select 'a1' as a, 4 as b, 1 as c
union all
select 'a1' as a, 5 as b, 1 as c
union all
select 'a2' as a, 6 as b, 1 as c
) d GROUP by ROLLUP (d.a, d.b)
order by grouping(a), a, grouping(b), b
推荐阅读
- ansible - 如何使用查找在全局可重用位置查找文件?
- gcc - 改进 Windows 上的 C 构建时间 (gcc 3.4.5)
- c# - 'Mon Oct 07 2019 00:00:00 GMT-0400' 未被识别为有效的 DateTime
- excel - 使用 Analysis Services 表格模型进行透视时,数据透视表变慢
- c# - 继承取决于计算的属性
- linux - Systemd 自动化——通过服务在启动时运行 Python 脚本
- angular - 生成字符串响应并在 Angular 应用程序中显示该响应的 Spring Boot 端点
- regex - 简单的常规替换列表中的所有正则表达式
- ionic4 - 在离子加载控制器中显示加载项
- sql - 如何使用 SQL Developer 提供的“技巧”将每个表从特定用户转换为 JSON 格式