代码之家  ›  专栏  ›  技术社区  ›  JDev

如何获取缺失值为零的聚合结果

  •  3
  • JDev  · 技术社区  · 7 年前

    我的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
    

    但是,我想将缺少的“test”列值列为0。所以预期的O/P应该是:

    test | sum
    hi-1 | 10
    hi-2 | 0
    
    2 回复  |  直到 7 年前
        1
  •  2
  •   Gordon Linoff    7 年前

    相反,使用条件聚合:

    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;
    
        2
  •  2
  •   Tim Biegeleisen    7 年前

    这里的问题是 WHERE 子句可能完全过滤掉 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;