Возвращает результат для каждой опции Select Case, если count равен 0 или строки не найдены - PullRequest
0 голосов
/ 26 июня 2018

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 голосов
/ 26 июня 2018

Вы также можете достичь того же с помощью следующего кода

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

ИЛИ

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
0 голосов
/ 26 июня 2018

Вы можете использовать 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
0 голосов
/ 26 июня 2018

Что вам действительно нужно, так это таблица, которая содержит все типы результатов.В отсутствие этого мы можем использовать 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 слеваприсоединиться.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...