在不知道表格背后的架构的情况下,并假设returncode = 1 是表示警报的原因:
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
更新
抱歉,我似乎没有正确阅读您的问题。您需要将我上面的原始答案与PIVOT 相结合,以展平结果集并获得您的 3 列。
CTE 几乎相同 - 它获取数据集并计算其 Type。之后,我们使用PIVOT 将每种类型的每天计数放入其自己的列中。
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
这会返回:
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
这也使用 Numbers table 来获得“每天 1 行,不管”要求。请注意,查询已更改为使用 DayNumber,以便此连接尽可能干净。