在结果集中包含“0”计数,DB2

Include "0" counts in result set, DB2

我是 运行 对 DB2 的查询:

SELECT column_1, COUNT(*) AS "my_count"
FROM "my_table"
WHERE column_1 IN(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
AND another_column = '20150609'
GROUP BY column_1;

这在获取按 column_1 分组的行数方面效果很好。但是,问题是我需要结果集为 "IN" 子句中计数为 0 的任何内容包含一个“0”行。

目前,如果 6、7 和 8 没有满足其他 "WHERE" 条件的行,结果如下所示:

column_1    my_count
    1         33
    2         20
    3         14
    4          2
    5         33
    9         27
    10        16

知道如何完成这个吗?谢谢!

这是一个使用递归 CTE 生成 1 到 10 值的简单解决方案。一旦你有了这个系列,将你的原始查询左连接到它,你就准备好了:

WITH v (column_1) AS (
    SELECT 1 FROM SYSIBM.SYSDUMMY1    
    UNION ALL
    SELECT column_1 + 1 FROM v WHERE column_1 <= 10
)
SELECT v.column_1, COUNT("my_table".column_1) AS "my_count"
FROM v
LEFT JOIN "my_table" ON v.column_1 = "my_table".column_1
-- Note that this predicate must be part of the LEFT JOIN condition
AND another_column = '20150609'
-- Note that this predicate might no longer be needed
WHERE "my_table".column_1 IN(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
GROUP BY v.column_1;

根据您的评论,我认为 column_1 值不一定是连续的。没问题,只需编写没有递归 CTE 的等效查询:

WITH v (column_1) AS (
    SELECT 1 FROM SYSIBM.SYSDUMMY1    
    UNION ALL
    SELECT 42 FROM SYSIBM.SYSDUMMY1
    UNION ALL
    SELECT 1337 FROM SYSIBM.SYSDUMMY1
)
SELECT v.column_1, COUNT("my_table".column_1) AS "my_count"
FROM v
LEFT JOIN "my_table" ON v.column_1 = "my_table".column_1
AND another_column = '20150609'
GROUP BY v.column_1;