在snowflake中使用SUM函数时,有没有一种方法可以返回零和空字符串



在snowflake/sql中使用sum函数时,显示零(0(或null与空的最佳方式是什么?例如,在执行以下操作时,当sum等于零时,我得到一个空字符串:sum(case when t.Status='Done' then 1 end)我缺少什么?

正如其他人所注意到的,Snowflake sum给ether NULL或a,它可以正常工作。

select 
sum(case when Status='Done' then 1 end) as this_is_null
,sum(case when Status='Done' then 1 else 0 end) as this_is_zero
,sum(case when Status='None' then 1 else 0 end) as this_is_one
,sum(iff(status='Done', 1, 0)) as this_is_also_zero
from values ('None') tmp(status); 

给予:

THIS_IS_NULL   THIS_IS_ZERO   THIS_IS_ONE   THIS_IS_ALSO_ZERO
<null>         0              1             0

因此,如果您得到一个空字符串,作为您的输出,这是因为您使用SUM的输出来进行字符串操作,并且出现了错误。

以你的评论为例,并将其扩展为有意义的。。。

SELECT left(t.date_task,4) as date
,left(DATE_TRUNC('week', t.date_task),10) as week_start
,sum(case when t.status='Done' then 1 else 0 end) as task_status
FROM ( 
select to_timestamp_ntz(date_task) as date_task, status 
from values ('2020-05-05', 'Done'),('2020-04-05', 'None') v(date_task, status)
) t
GROUP BY 1,2;

给出了看似正确的结果:

DATE    WEEK_START  TASK_STATUS
2020    2020-05-04  1
2020    2020-03-30  0

尽管可以使用coalesce(),但最简单的方法是else子句:

sum(case when t.Status = 'Done' then 1 else 0 end)

SQL现在支持另一种语法:

count(*) filter (where t.Status = 'Done')

然而,Snowflake(目前(并不支持这一点。

相关内容

最新更新