首页 > 解决方案 > 如果计数为 0 或未找到行,则返回每个 Select Case 选项的结果

问题描述

TSQL 2008r2。我希望这个查询总是返回三行。SELECT CASE 中指定的每个项目一个:

SELECT CASE result 
WHEN 'A' then 'Group A' 
WHEN 'B' then 'Group B' 
WHEN 'C' then 'Group C' 
end as resultType, count(Result) as numberOfResults from masterGroups 
where theYear=2016 and postCode=3579 group by result;

ATM它正确地返回这个:

Group A    1
Group C    8

无论它在 masterGroups 中找到什么,我都希望它始终返回三行。如果找不到这三个项目之一,我希望它返回 0。所以在上述情况下,它应该返回:

Group A    1
Group B    8
Group C    0

提前致谢

标签: sqlsql-server-2008tsql

解决方案


你真正想要的是一个包含所有结果类型的表。如果没有这个,我们可能会为此目的使用动态 CTE:

WITH results AS (
    SELECT 'A' AS result UNION ALL
    SELECT 'B' UNION ALL
    SELECT 'C'
)

SELECT
    CASE r.result 
        WHEN 'A' THEN 'Group A' 
        WHEN 'B' THEN 'Group B' 
        WHEN 'C' THEN 'Group C' 
    END AS resultType,
    COUNT(m.result) AS numberOfResults
FROM results r
LEFT JOIN masterGroups m
    ON r.result = m.result AND m.theYear = 2016 AND m.postCode = 3579
GROUP BY
    r.result;

注意:将当前WHERE子句中的逻辑移动到ON左连接的条件。


推荐阅读