提问人:Alex 提问时间:12/11/2022 最后编辑:Jonas MetzlerAlex 更新时间:12/12/2022 访问量:76
如何对多列中的非 null 值求和(CASE WHEN 限制的解决方法) Postgresql的
How to sum non-null values from multiple columns (workaround for CASE WHEN limitation) Postgresql
问:
因此,我基本上想解决这样一个事实,即 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 个输入)——我希望有一个可重用的函数,将来可以再次使用。
答:
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)
评论