2016-11-08 3 views
0

У меня есть следующие SQL таблицы:SQL Query - граф и список 0 вместо Null

Basic structure

структура базы данных & хотел выхода:

Data base structure & wanted output

Любая идея, как запрос будет смотреться? Я также хотел бы поставить 0 вместо Null в случае, если результатов нет.

уш Stian

+2

Какая СУБД вы используете? –

+1

У вас есть только эти 4 типа событий? –

+0

MS SQL Server 2008 –

ответ

0

Так как вы закрепили types, используйте статические Conditional Aggregate

select cast([Date] as Date), 
     count(case when type = 'Maintenance' then 1 end) as [Maintenance] 
     count(case when type = 'Fault' then 1 end) as [Fault] 
     count(case when type = 'Alarm' then 1 end) as [Alarm] 
     count(case when type = 'Critical Fault' then 1 end) as [Critical Fault] 
From yourtable 
Group by cast([Date] as Date) 

Когда нет никакого особого type для Date тогда Count агрегат будет возвращать 0

0

Чтобы поставить 0 вместо нулевого вам нужно только для этого ISNULL (Column_Name , 0) для числовых значений и IsNull (column_name, '0')

0
SELECT CAST([Date] AS DATE) Event_date 
     sum(Case when type = 'Maintenance' then 1 else 0 end) as Maintenance 
     ,sum(Case when type = 'Fault' then 1 else 0 end) as Fault 
     ,sum(Case when type = 'Alarm' then 1 else 0 end) as Alarm 
     ,sum(Case when type = 'Critical Fault' then 1 else 0 end) as [Critical Fault] 
FROM Table 
GROUP BY Cast([Date] as Date) 
ORDER BY Event_date 

Я больше веера суммы здесь. Нет необходимости в объединении, поскольку 1+ или 0 всегда будут возвращаться, так как каждый столбец с поворотным столом будет иметь значение 0 или 1+.

-1
DECLARE @table table (Date datetime NOT NULL, Type varchar(50) NOT NULL); 
INSERT INTO @table 
VALUES 
    ('08.11.2016 14:23','Maintenance'), 
    ('08.11.2016 10:45','Fault'), 
    ('08.11.2016 10:44','Alarm'), 
    ('08.11.2016 14:23','Critical Falut'), 
    ('08.11.2016 14:23','Maintenance'), 
    ('08.11.2016 10:45','Fault'), 
    ('08.11.2016 10:44','Alarm'), 
    ('08.11.2016 14:23','Critical Falut'), 
    ('07.11.2016 14:23','Maintenance'), 
    ('07.11.2016 10:45','Fault'), 
    ('07.11.2016 10:44','Alarm'), 
    ('07.11.2016 14:23','Maintenance'), 
    ('07.11.2016 10:45','Fault'), 
    ('07.11.2016 10:44','Alarm') 
; 

-- if the value contains a space don't for get to quote it with [] i.e. [Some Value] 
SELECT Date = P.DateDay, P.Maintenance, P.Fault, P.Alarm, P.[Critical Falut] 
FROM (
    SELECT DateDay = CONVERT(date, Date), Date, Type 
    FROM @table 
) AS T 
PIVOT (COUNT(Date) FOR Type IN (Maintenance, Fault, Alarm, [Critical Falut])) AS P 
; 

Редактировать: Мне любопытно, почему это было отклонено, когда это точка опоры, которая точно отвечает на вопрос пользователей.

Смежные вопросы