如何获得缺失值为零的合计结果

时间:2019-01-24 00:32:40

标签: sql postgresql

我的DDL就像

create table if not exists sample_t
(
  id              bigserial NOT NULL constraint sample_t_id primary key,
  test_value varchar(255),
  test    varchar(255) not null,
  count     bigint not null
);

示例插入查询

INSERT INTO public.sample_t (id, test_value, test, count) VALUES (1, 'CC1', 'hi-1', 11);
INSERT INTO public.sample_t (id, test_value, test, count) VALUES (2, 'CC2', 'hi-1', 10);
INSERT INTO public.sample_t (id, test_value, test, count) VALUES (3, 'CC1', 'hi-2', 4);

我的查询是

select test, sum(count) from sample_t where test_value= 'CC2'  group by test;

o / p是

test | sum
hi-1 | 10

但是,我想将缺少的“测试”列值列出为0。因此,预期的o / p应该如下所示:

test | sum
hi-1 | 10
hi-2 | 0

2 个答案:

答案 0 :(得分:2)

相反,请使用条件聚合:

select test, sum(case when test_value = 'CC2' then count else 0 end)
from sample_t
group by test;

或者,如果您有一个包含所有test值的表:

select t.test, coalesce(sum(count), 0)
from test t left join
     sample_t s
     on s.test = t.test and s.test_value = 'CC2'
group by t.test;

答案 1 :(得分:2)

这里的问题是,如果WHERE子句的记录中没有一个具有匹配的测试值,则该子句可能会完全过滤掉test组。您可以在此处使用左连接保留每个初始test值:

SELECT DISTINCT
    s1.test,
    COALESCE(s2.cnt, 0) AS cnt
FROM sample_t s1
LEFT JOIN
(
    SELECT test, COUNT(*) AS cnt
    FROM sample_t
    WHERE test_value = 'CC2'
    GROUP BY test
) s2
    ON s1.test = s2.test;

或者,您可以使用条件聚合:

SELECT
    test, COUNT(CASE WHEN test_value = 'CC2' THEN 1 END) cnt
FROM sample_t
GROUP BY test;