Давайте рассмотрим следующий сценарий.
CREATE TABLE Replicant (Name NVARCHAR(10),Gen INT);
INSERT INTO Replicant VALUES ('tymtam', 2), ('Roy', 6);
SELECT
CASE WHEN Gen < 10 THEN '<10' ELSE '>=10' END as 'Gen',
count(*) as 'Count'
FROM Replicant
GROUP BY CASE WHEN Gen < 10 THEN '<10' ELSE '>=10' END;
Результат представляет собой одну строку:
Gen Count
<10 2
Могу ли я усовершенствовать запрос, чтобы получить ноль для ELSEcase?
Gen Count
<10 2
>=10 0
Обновление 2
Мой дискриминатор имеет значение 'null'
SELECT CASE WHEN Gen IS NOT NULL THEN 'Known' ELSE 'Unknown' END as 'Gen', count(*) as 'Count' FROM Replicant
GROUP BY CASE WHEN Gen IS NOT NULL THEN 'Known' ELSE 'Unknown' END;
Результат
Gen Count
Known 2
и я тоскую по
Gen Count
Known 2
Unknown 0
Обновление 1
В моем контексте у меня есть пары запросов (метрик) для разных поколений репликантов:
INSERT INTO [dbo].[Metrics] (...) SELECT
'Metric X for >=10' as 'Name',
COUNT(*) AS 'Count',
(80_char_expression) AS 'Sum',
(80_char_expression) AS 'Min',
(80_char_expression) AS 'Max',
0 AS 'StandardDeviation'
FROM Replicant
WHERE TimestampUtc > DATEADD(WEEK, -1, Current_Timestamp)
AND Gen >= 10
INSERT INTO [dbo].[Metrics] (...) SELECT
'Metric X for <10' as 'Name',
--7 lines repeated from the 1st query
AND Gen < 10
Я бы предпочел иметь один выбор для вставки двух строк, даже если нет записей.