【问题标题】:How to distinguish between real NULL and formal NULL in Postgres ROLLUP?如何区分 Postgres ROLLUP 中的真实 NULL 和正式 NULL?
【发布时间】:2021-09-04 13:00:27
【问题描述】:

我正在尝试确定每个给定行所属的 ROLLUP 报告的“级别”。当初始数据不包含空值时,可以只计算每一行中的空值(对于每个给定的分组级别/层,空单元格的数量是相同的),尽管在我看来它也不是一个漂亮的解决方案。

如果初始数据包含 NULL,则此解决方法不再有效:在示例查询结果表中,您会看到 <null> 来自真正的 null,而 (null) 是分组单元格的标准 NULL 占位符。

我希望在分层查询中找到类似于“虚拟列”的内容(如LEVELPATH 等)。

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   |
-------------------------- 

【问题讨论】:

    标签: sql postgresql postgresql-12 grouping-sets


    【解决方案1】:

    使用分组,有点

    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
    

    【讨论】:

      猜你喜欢
      • 2012-03-01
      • 1970-01-01
      • 2019-09-11
      • 2010-09-05
      • 1970-01-01
      • 2017-04-16
      • 2019-05-09
      • 2011-04-27
      • 2014-01-26
      相关资源
      最近更新 更多