如何解决如何在 Postgres ROLLUP 中区分真正的 NULL 和正式的 NULL?
我试图确定每个给定行所属的 ROLLUP 报告的“级别”。当初始数据不包含 NULL 时,则可以只计算每一行中的空值(每个给定级别/分组层的空单元格数量相同),尽管在我看来它也不是一个漂亮的解决方案。>
如果初始数据包含 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,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,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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。