如何对多列中的非 null 值求和(CASE WHEN 限制的解决方法) Postgresql的

How to sum non-null values from multiple columns (workaround for CASE WHEN limitation) Postgresql

提问人:Alex 提问时间:12/11/2022 最后编辑:Jonas MetzlerAlex 更新时间:12/12/2022 访问量:76

问:

因此,我基本上想解决这样一个事实,即 CASE WHEN 在找到第一个 TRUE 返回值时停止执行。

我想对多列之间非 null 值的每个实例求和,并根据我的 ID 对它们进行分组。 示例表:

编号 输入1 输入2 输入3
1 一个 k
2 b
3
4 q r
5 x p j
6 y q

我希望我的函数的输出是:

编号 total_inputs
1 2
2 1
3 0
4 2
5 3
6 2

有什么解决方法吗?自定义函数是否用于在多个列中创建唯一或非 null 条目的计数,按行分组?

我知道我可以创建一个 CTE 并将 1 分配给每个非 null 列,但这似乎很乏味(我的数据集有 39 个输入)——我希望有一个可重用的函数,将来可以再次使用。

SQL PostgreSQL 大小写

评论

0赞 Alex 12/11/2022
我做了额外的CTE方法及其功能,但不优雅。希望有更好的方法。with messy_CTE AS( SELECT id ,当 input1 不为 null 时,则 1 else 0 以 a 结尾,当 input2 不为 null 时,则 1 else 0 以 b 结尾,当 input3 不为 null 时,则 1 else 0 以 c FROM my_table 结尾,则 select id,a + b + c from messy_CTE 等。但我的数据集又很大。不喜欢这种方法。

答:

2赞 ahmed 12/11/2022 #1

您可以使用简单的聚合,如下所示:

Select id, 
       Count(input1) + Count(input2) + Count(input3) As total_inputs
From table_name
Group By id
Order By id

请注意 Count(inputX) = 0,其中 inputX 为 null。

观看演示

0赞 tinazmu 12/12/2022 #2

我们可以简单地使用:

select ID,
       case when input1 is not null then 1 else 0 end 
     + case when input2 is not null then 1 else 0 end 
     + ...
     + case when input39 is not null then 1 else 0 end as total_inputs
from ...

如果您想要每一行(或计数,我们不是聚合行 - 这就是 COUNT()..GROUP BY 用于)或 CTE。

此外,对于某些 PostgreSQL 版本,有一个 num_nulls 函数来计算空参数:

select
  , 32-num_nulls(input1, input2, input3, ..., input32)