当前位置: 代码迷 >> Sql Server >> sql 分组 查询解决方案
  详细解决方案

sql 分组 查询解决方案

热度:370   发布时间:2016-04-24 08:53:31.0
sql 分组 查询
2015-09-01 00:00:00.000     A    1
 2015-09-01 01:00:00.000     A    1
 2015-09-01 02:00:00.000     A    1
 2015-09-02 03:00:00.000     B    2
 2015-09-01 04:00:00.000     B    2
 2015-09-01 05:00:00.000     B    2
 2015-09-01 06:00:00.000     A    1
 2015-09-01 07:00:00.000     A    1
 2015-09-01 08:00:00.000     A    1
 2015-09-01 09:00:00.000     B    1
 2015-09-01 10:00:00.000     B    1
 2015-09-01 11:00:00.000     B    1


 2015-09-01 00:00:00.000       A    3
 2015-09-01 03:00:00.000       B    6
 2015-09-01 06:00:00.000       A    3
 2015-09-01 09:00:00.000       B    3


我的表是上面第一个,是每三个小时A和B会交换一下,我想要的结果是,查询一个月的数据。每三个小时合并成一条,最后面的数字是SUM,就是下面的表,查询条件是按月查询。显示这一个月这样的数据
------解决思路----------------------
with tb (sdate,name,id)
as
(
  select '2015-09-01 00:00:00.000','A',    1 union all
  select '2015-09-01 01:00:00.000','A',    1 union all
  select '2015-09-01 02:00:00.000','A',    1 union all
  select '2015-09-01 03:00:00.000','B',    2 union all
  select '2015-09-01 04:00:00.000','B',    2 union all
  select '2015-09-01 05:00:00.000','B',    2
)
select min(sdate)sdate,name,SUM(id)id from tb group by DATEPART(HH,sdate)/3,name

------解决思路----------------------
还有你第四条数据错了吗 是2015-09-01吗
------解决思路----------------------
#1会把多天的3小时统计在一起
/* 测试数据
WITH table1(dt,code,value)AS(
    SELECT '2015-09-01 00:00:00.000','A',1 UNION ALL
    SELECT '2015-09-01 01:00:00.000','A',1 UNION ALL
    SELECT '2015-09-01 02:00:00.000','A',1 UNION ALL
    SELECT '2015-09-01 03:00:00.000','B',2 UNION ALL
    SELECT '2015-09-01 04:00:00.000','B',2 UNION ALL
    SELECT '2015-09-01 05:00:00.000','B',2 UNION ALL
    SELECT '2015-09-02 00:00:00.000','A',1 UNION ALL
    SELECT '2015-09-02 01:00:00.000','A',1 UNION ALL
    SELECT '2015-09-02 02:00:00.000','A',1 UNION ALL
    SELECT '2015-09-02 03:00:00.000','B',3 UNION ALL
    SELECT '2015-09-02 04:00:00.000','B',2 UNION ALL
    SELECT '2015-09-02 05:00:00.000','B',3
)*/
    SELECT MIN(dt) dt,
           MIN(code) code,
           SUM(value) value
      FROM table1
  GROUP BY DATEDIFF(hour,'2015-09-01',dt)/3

dt                      code       value
----------------------- ---- -----------
2015-09-01 00:00:00.000 A              3
2015-09-01 03:00:00.000 B              6
2015-09-02 00:00:00.000 A              3
2015-09-02 03:00:00.000 B              8
  相关解决方案