【问题标题】:mssql calculate total by hourmssql 按小时计算总计
【发布时间】: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


【解决方案1】:

试试这个查询。

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',
    DATEPART(hh, DATEADD(hh,-DATEPART(hh, created),GetDate())) AS SortHour,
    [severity],
      count([id]) as incidents
  FROM [ALARM_TRANSACTION_SUMMARY]
  where created >= GETDATE()-1 
  group by DATEPART(hh, created), severity
  Union ALL
   select NumberValue,DATEPART(hh, DATEADD(hh,-NumberValue,GetDate())), NULL, NULL
   From NumberTable
  ) PS
PIVOT
(
SUM (incidents)
FOR severity IN
( [Critical], [Information], Major, Minor, Warning)
) AS pvt
order by SortHour

【讨论】:

  • 如果答案适合您,请将其标记为答案
  • 嗨,Kiran,忘记了一项(更新了上面的帖子)。我正在对数字表执行“全部联合”以强制“零”计数小时。使用当前的解决方案,这不起作用......除非我错过了一些非常简单的东西......这是很有可能的。有没有办法让两者再次合并?我需要在没有记录计数的情况下显示“零”值。
  • 我不确定 NumberTable 包含什么,刚刚更新了查询,你能检查一下是否有效吗?
  • 对不起...数字表只是一个单列表,数字从 0 到 23
  • 输出的作用是结合 1 到 23 开始,然后显示带有值的排序列...
【解决方案2】:
(original query)
ORDER BY
    CASE WHEN [Hour] >= DATEPART(HOUR, GETDATE())
        THEN [Hour]
        ELSE [Hour] + 24
    END

【讨论】:

    【解决方案3】:

    未经测试,但从外观上看,这应该可行;不要认为我们需要将它包含在选择中。

    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,
            max(created) as SortDate
          FROM [ALARM_TRANSACTION_SUMMARY]
          where created >= GETDATE()-1 
          group by DATEPART(hh, created), severity, max(created)
          ) PS
        PIVOT
        (
        SUM (incidents)
        FOR severity IN
        ( [Critical], [Information], Major, Minor, Warning)
        ) AS pvt
        ORDER BY sortDate desc;
    

    【讨论】:

      猜你喜欢
      • 2017-11-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多