SQL Server: как показать строки-заполнители из оператора case? - PullRequest
0 голосов
/ 15 марта 2019

Если у меня есть таблица данных о возрасте людей, такая как:

Name    |    Age
--------+-----------
John    |    35
Mike    |    45

И мне нужно сгруппировать и вывести эти данные в стандартную таблицу, такую ​​как:

Grouper  |    Count
---------+-------------
Under 50 |      2
Over 50  |      0

Я выполняю запрос, подобный этому (набран быстро, может не работать в реальной жизни. Иллюстрируя ситуацию, когда я использую оператор case для создания групп):

select
    case
       when Age <= 50 then 'Under 50'
       else 'Over 50'
    end as 'Grouper',
    count(Age) as 'Count'
from 
    theTable
group by 
    'Grouper'

Я получаюответьте следующим образом, поскольку в таблице нет людей старше 50 лет:

Grouper  |    Count
---------+-------------
Under 50 |      2

Как заставить мои результаты сохранять каждое значение в операторе case, даже если в таблице не найдено значений для него?Я не могу вставить или изменить какие-либо данные или таблицы, это будет сделано исключительно для целей отчетности.

Ответы [ 2 ]

4 голосов
/ 15 марта 2019

Я бы сказал так:

select v.grouper, count(Age) as 'Count'
From (values ('Under 50', 0, 51), ('Over 50', 51, null)) v(grouper, lo, hi) left join
     theTable t
     on t.age >= v.lo and
        (t.age < v.hi or v.hi is null)
Group by grouper;

Это создает что-то вроде временной таблицы поиска с возрастными диапазонами и строкой, которую вы хотите включить. Важная часть - с вашей точки зрения - это left join. Это сохраняет все возрастные диапазоны.

2 голосов
/ 15 марта 2019

Используйте UNION, например:

select
  'Under 50' as grouper,
  sum(case when age <= 50 then 1 end) as count
from theTable
union
select
  'Over 50' as grouper,
  sum(case when age > 50 then 1 end) as count
from theTable
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...