Показать нулевые значения в CASE + SUM - PullRequest
1 голос
/ 29 апреля 2019

У меня есть таблица со следующей структурой:

CREATE TABLE [dbo].[TESTING](
    [ID] [nvarchar](2) NULL,
    [TYPE] [nvarchar] (1) NULL,
    [TIME] [int] NULL

и со следующими данными:

INSERT INTO [dbo].[TESTING]
           ([ID]
           ,[TYPE]
           ,[TIME])
     VALUES
('A1','1',3),
('A1','1',6),
('A2','2',8),
('A2','2',9),
('B1','1',2),
('B1','1',6),
('B2','2',4),
('B2','2',8),
('B2','2',11),
('B2','2',12)

Что я хочу сделать, так это. Я хочу создать столбец, который получает значение "<= 5", если <strong>TIME меньше или равно 5 или "> 5", если TIME больше 5.

тогда я поставил следующее утверждение:

select ID,  TYPE, 
(case when TIME <= 5 then '<= 5' 
when TIME > 5 then '> 5' 
else 'OTHER' end) AS CONDITION, 
SUM(TIME) TOTAL 
from [dbo].[TESTANDO] 
GROUP BY ID, TYPE,
(case when TIME <= 5 then '<= 5' 
when TIME > 5 then '> 5' 
else 'OTHER' end)

Результат:

enter image description here

Хотелось бы, чтобы в дополнение к появившимся данным, если есть значения, в которых "<= 5 или> 5" не имеют значений, строка, с которой я иду, TOTAL 0 В этом примере у меня нет строк из группы A2, которые удовлетворяют условию "<= 5", которое должно появиться в результате со столбцом <strong>TOTAL = 0

вот так:

enter image description here

1 Ответ

1 голос
/ 29 апреля 2019

Используйте cross join для генерации строк, а затем left join и агрегацию для заполнения значений:

select i.id, i.type, c.condition, coalesce(sum(time), 0) as total
from (select distinct id, type from testing) i cross join
     (values ('<= 5'), ('> 5')) c(condition) left join
     testing t
     on t.id = i.id and
        t.type = i.type and
        ((condition = '<= 5' and time <= 5) or
         (condition = '> 5' and time > 5)
        )
group by i.id, i.type, c.condition
order by i.id, i.type, c.condition;

Здесь - это дБ <> скрипка.

...