如果计数为0或未找到行,则返回每个“选择案例”选项的结果

时间:2018-06-26 05:41:39

标签: sql sql-server-2008 tsql

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

预先感谢

3 个答案:

答案 0 :(得分:2)

这里真正想要的是一个包含所有结果类型的表。如果没有这种情况,我们可以为此使用即时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条件。

答案 1 :(得分:2)

您也可以通过以下代码实现相同的目的

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

OR

FROM (SELECT 'A' UNION SELECT 'B' UNION SELECT 'C') r (groups)
LEFT JOIN masterGroups m ON m.Result = r.groups
    AND theYear=2016 AND postCode=3579 
GROUP BY groups

答案 2 :(得分:0)

您可以使用PIVOTUNPIVOT

select resultType,numberOfResults
from
(
select 'numresults' numresults,[A]'Group A',[B] 'Group B',[C] 'Group c'
from
( 
select result from masterGroups where theYear=2016 and postCode=3579
)as source
pivot
(
count(result) for result in ([A],[B],[C])
)as p
)ss
unpivot
(
numberOfResults
for resultType in ([Group A], [Group B], [Group c])
)up