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
预先感谢
答案 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)
您可以使用PIVOT
和UNPIVOT
:
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