按日期分组时将整数行转换为列

Posted

技术标签:

【中文标题】按日期分组时将整数行转换为列【英文标题】:Converting Integer Rows into Columns While Grouping by Date 【发布时间】:2015-06-21 14:00:05 【问题描述】:

我有下表包含这些列 TimeStamp[DateTime]、FromSysId[Int]、CrUSSDCnt[Int]

       TimeStamp           FromSysId          CrUSSDCnt
2015-06-18 18:58:15.380        25                 7
2015-06-18 19:45:17.130        21                 8
2015-06-18 20:43:18.920        22                 15
2015-06-18 21:34:33.090        25                 6
2015-06-18 22:55:33.317        22                 10

我想将每个 FromSysId 显示为列,同时计算每个 FromSysId 的 CrUSSDCnt 列,并按小时对 TimeStime 进行分组,如下所示:

       TimeStamp         Sys25   Sys22     Sys21       
2015-06-18 18:00:00       2        1         0
2015-06-18 19:00:00       4        6         3
2015-06-18 20:00:00       0        5         6
2015-06-18 21:00:00       0        7         2
2015-06-18 22:00:00       1        0         4

我尝试使用 pivot 或 Joint,但我都未能像这样总结。 任何帮助。

【问题讨论】:

请用无效的查询编辑您的问题。 【参考方案1】:

这个问题的难点在于从时间中提取小时。这是一种方法:

select dateadd(hour, 0, datediff(hour, 0, timestamp)) as ToTheHour,
       sum(case when FromSysId = 25 then CrUSSDCnt else 0 end) as Sys25,
       sum(case when FromSysId = 22 then CrUSSDCnt else 0 end) as Sys22,
       sum(case when FromSysId = 21 then CrUSSDCnt else 0 end) as Sys21
from table t
group by dateadd(hour, 0, datediff(hour, 0, timestamp))
order by ToTheHour;

剩下的只是条件聚合。

【讨论】:

@AbdallaOmar 。 . .如果你有问题,你应该把它当作一个问题而不是一个答案。如果您仍需要帮助,请提出另一个问题。

以上是关于按日期分组时将整数行转换为列的主要内容,如果未能解决你的问题,请参考以下文章

SQL将行转置为列(按键变量分组)?

有没有办法从 min(date) 开始按 30 天的间隔对时间戳数据进行分组并将它们添加为列

Tsql 将行转置为列,按列分组

将按月分组的行计数为列

PostgreSQL 查找按日期分组的前 N ​​行

按日期对数据进行分组并将DateTime转换为Double