Есть ли способ вернуть ноль вместо пустой строки при использовании функции СУММ в снежинке? - PullRequest
0 голосов
/ 05 мая 2020

Как лучше всего отображать ноль (0) или ноль вместо пустого при использовании функции суммы в snowflake / sql? Например, я получаю пустую строку, когда сумма равна нулю, когда выполняю следующие действия: sum(case when t.Status='Done' then 1 end) Что мне не хватает?

Ответы [ 2 ]

1 голос
/ 05 мая 2020

Как уже отметили все, 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
0 голосов
/ 05 мая 2020

Хотя вы можете использовать coalesce(), самый простой метод - это предложение else:

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

SQL теперь поддерживает альтернативный синтаксис:

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

Однако Snowflake (пока) не поддерживает это.

...