【发布时间】:2014-06-23 12:43:53
【问题描述】:
我有一个基本上包含错误日志的表。这些错误基于各种因素而出现,并且具有不同的严重性。我正在尝试获取一个查询,将 24 小时内每小时每个严重性的总数汇总起来。
除了一件小物件外,我的工作正常。结果按小时排序,小时总是从 0 开始。我需要的是它按照真实的时间顺序排列。这意味着如果查询在 6/23 中午运行,则查询需要在 6/22 中午有第一条记录。
示例表数据: ID 创建严重性
FL41988194-51133 4/13/2014 20:21 critical
JO03982444-74849 4/14/2014 12:46 major
JO03982444-74852 4/14/2014 12:46 major
JO03982444-74855 4/14/2014 12:46 major
BY79194841-06182 4/19/2014 19:54 major
BY79194841-06183 4/19/2014 19:54 major
BY79194841-06184 4/19/2014 19:54 major
TV90425333-88384 5/20/2014 7:02 major
FZ23706935-25024 6/7/2014 14:56 major
SY05532197-47119 6/12/2014 3:57 major
这是我当前的代码:
select
[Hour], ISNULL([Critical],0) as Critical, ISNULL([Major],0) as Major, ISNULL([Minor],0) as Minor, ISNULL([Warning],0) as Warning,
ISNULL([Information],0) as Information,
ISNULL([Critical],0) + ISNULL([Warning],0) + ISNULL([Major],0) + ISNULL([Minor],0) + ISNULL([Information],0) as [Total]
from
(SELECT
DATEPART(hh, created) as 'Hour',
[severity],
count([id]) as incidents
FROM [ALARM_TRANSACTION_SUMMARY]
where created >= GETDATE()-1
group by DATEPART(hh, created), severity
**Union ALL
select NumberValue, NULL, NULL
From NumberTable**
) PS
PIVOT
(
SUM (incidents)
FOR severity IN
( [Critical], [Information], Major, Minor, Warning)
) AS pvt
当前输出如下所示:
小时 关键 重大 轻微 警告 信息 总计---- -------- ----- ----- -------- ------------ ----- 0 0 0 0 0 0 0 1 0 0 0 0 0 0 2 0 0 0 0 0 0 3 0 1 0 0 0 1 4 0 0 0 0 0 0 5 0 0 0 0 0 0 6 0 0 0 0 0 0 7 0 1 0 0 0 1 8 0 0 0 0 0 0 9 0 0 0 0 0 0 10 0 0 0 0 0 0 11 0 0 0 0 0 0 12 0 3 0 0 0 3 13 0 0 0 0 0 0 14 0 1 0 0 0 1 15 0 0 0 0 0 0 16 0 0 0 0 0 0 17 0 0 0 0 0 0 18 0 0 0 0 0 0 19 0 2 0 0 0 2 20 1 0 0 0 0 1 21 0 0 0 0 0 0 22 0 0 0 0 0 0 23 0 0 0 0 0 0
正如我上面所说,这确实给了我每小时的总数,但总数的排序顺序错误......所以如果我在下午 2 点运行它,我需要输出如下所示:
小时 关键 重大 轻微 警告 信息 总计---- -------- ----- ----- -------- ------------ ----- 14 0 1 0 0 0 1 15 0 0 0 0 0 0 16 0 0 0 0 0 0 17 0 0 0 0 0 0 18 0 0 0 0 0 0 19 0 2 0 0 0 2 20 1 0 0 0 0 1 21 0 0 0 0 0 0 22 0 0 0 0 0 0 23 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 2 0 0 0 0 0 0 3 0 1 0 0 0 1 4 0 0 0 0 0 0 5 0 0 0 0 0 0 6 0 0 0 0 0 0 7 0 1 0 0 0 1 8 0 0 0 0 0 0 9 0 0 0 0 0 0 10 0 0 0 0 0 0 11 0 0 0 0 0 0 12 0 3 0 0 0 3 13 0 0 0 0 0 0
另一件事。这是一个报告,需要按上述方式呈现数据(图表软件不够智能,无法使用原始数据和时间戳小计)。
【问题讨论】:
-
看了一分钟后,我认为您需要将
group by DATEPART(hh, created), severity更改为使用日期和小时的内容。您可能必须在hour列中包含日期,然后将其删除以显示(使用派生表或 CTE) -
获取每小时的最大或最小时间戳并对其进行排序。这样一来,一天就开始发挥作用了,排序就起作用了。不应该显示它。
标签: sql sql-server