我的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
答案 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;