Without knowing the schema behind the tables, and making a big assumption that returncode = 1
is what indicates an alarm:
SELECT IIF(returncode = 1, 'alarms', 'events') as [Type]
, CAST(extended_timestamp AS DATE) as DateField
, count(*) as SumField
FROM [dbauditor_repo].[dbo].[dbauditor_repo_events]
WHERE extended_timestamp > DATEADD(day, DATEDIFF(day, 0, GETDATE())-7, 0)
GROUP BY IIF(returncode = 1, 'alarms', 'events'), CAST(extended_timestamp AS DATE)
ORDER BY DateField
Update
Apologies, it seems I didn't read your question properly. What you need is a combination of my original answer above with a PIVOT
to flatten the resultset and get you your 3 columns.
The CTE is pretty much the same - its taking the dataset and calculating its Type
. After this, we use PIVOT
to place the count-per-day for each Type into its own column.
declare @events table (ID int, extended_timestamp datetime, returncode int)
insert into @events values (1, dateadd(day, -6, GETDATE()), 0), (2, dateadd(day, -6, GETDATE()), 1), (3, dateadd(day, -6, GETDATE()), 1), (4, dateadd(day, -5, GETDATE()), 1);
WITH CTE AS(
SELECT IIF(returncode = 1, 'alarms', 'events') as [Type]
, DATEDIFF(day, 0, extended_timestamp) as DayNumber
, count(*) as SumField
FROM @events
WHERE extended_timestamp >= DATEADD(day, DATEDIFF(day, 0, GETDATE())-6, 0)
GROUP BY IIF(returncode = 1, 'alarms', 'events'), DATEDIFF(day, 0, extended_timestamp)
)
, CTE2 AS(
select DayNumber, [events] + [alarms] as [events], [alarms]
from
(select SumField, DayNumber, [Type] from CTE) as _S
PIVOT (
SUM(SumField)
FOR [Type] IN ([events], [alarms])
) as _P
)
select cast(DATEADD(day, n.N, 0) as Date) as DateField, [events], [alarms]
from dbo.Numbers n
left outer join CTE2 on n.N = DayNumber
where n.N between DATEDIFF(day, 0, GETDATE()) - 6 and DATEDIFF(day, 0, GETDATE())
order by 1
This returns:
DateField events alarms
---------- ----------- -----------
2014-07-31 3 2
2014-08-01 1 1
2014-08-02 NULL NULL
2014-08-03 NULL NULL
2014-08-04 NULL NULL
2014-08-05 NULL NULL
2014-08-06 NULL NULL
This also uses a Numbers table to get the '1 row per day regardless' requirement. Note that the query changed to use DayNumber, so that this join could be as clean as possible.