SQL分时段统计

  • pupstar
  • (v5star)
  • 等 级:
  • 结帖率:
楼主发表于:2010-01-02 16:42:10
我现在有一张表:
  列名1                时间
03174190188 2009-11-01 07:17:39.217
015224486575 2009-11-01 08:01:17.153
013593006926 2009-11-12 08:04:46.560
013599584239 2009-11-22 08:53:27.763
013911693526 2009-11-23 08:53:51.683
013846472440 2009-11-23 08:54:57.233
013990353697 2009-11-24 08:55:25.077
013990353697 2009-11-25 08:56:01.327
013945594843 2009-11-26 08:57:02.233
013990353697 2009-11-27 08:57:29.700
013916597421 2009-11-28 08:59:49.390
03916995857 2009-11-29 09:11:05.607
015097712001 2009-11-30 09:13:50.293

现在想要做一个报表:

时段     2009-11-1 2009-11-2  2009-11-3  合计
00:00-01:00 0 0 0        0
01:00-02:00 0 0 0        0
02:00-03:00 0 0 0        0
03:00-04:00 0 0 0        0
04:00-05:00 0 0 0        0
05:00-06:00 0 0 0        0
06:00-07:00 0 1 1        2
07:00-08:00 1 4 4        9
08:00-09:00 11 16 13        .
09:00-10:00 11 26 13        .
10:00-11:00 12 29 25        .
11:00-12:00 6 7 11        .
12:00-13:00 4 9 2
13:00-14:00 5 10 11
14:00-15:00 13 16 23
15:00-16:00 14 5 17
16:00-17:00 10 5 18
17:00-18:00 7 3 6
18:00-19:00 7 2 5
19:00-20:00 4 0 5
20:00-21:00 5 3 0
21:00-22:00 2 0 0
22:00-23:00 2 1 0
23:00-24:00 0 0 0
合计         114      137      154      405

希望大家帮帮我。
我希望是用sql语句就搞定的,便于扩展, 但不想用临时表 或 UNION All
 
 
回复次数: 135

 

#1楼 得分:0回复于:2010-01-02 16:45:13
需要使用一个临时表(当然可以用语句做成子查询)+动态SQL语句.


如果要,可以帮你写.
 
  • liangCK用户头像
  • liangCK
  • (小梁爱兰儿..只爱兰.!❤)
  • 等 级:
  • 2

    2

#2楼 得分:0回复于:2010-01-02 16:46:22
只显示2009-11-1 2009-11-2  2009-11-3这三天?
 
#3楼 得分:0回复于:2010-01-02 16:47:28
大哥能贴一下代码么?
 
#4楼 得分:0回复于:2010-01-02 16:49:07
用户输入一个时间段 ,比如开始时间 2009-12-1 结束时间 2009-12-30 这样。
 
#5楼 得分:0回复于:2010-01-02 16:49:20
要用临时表加动态sql。
 
#6楼 得分:2回复于:2010-01-02 16:52:19
SQL code
            
-- 参考这个 -- > 测试数据:@table declare @table table ( [ id ] int , [ day ] varchar ( 10 ), [ starttime ] varchar ( 10 ), [ overtime ] varchar ( 10 ), [ name ] varchar ( 10 )) insert @table select 1 , ' 20091202 ' , ' 09:00 ' , ' 16:00 ' , ' 张三 ' declare @begdate datetime , @enddate datetime select @begdate = ' 20091129 ' , @enddate = ' 20091205 ' select t. [ date ] ,t. [ time ] ,u. [ name ] into # temp from ( select convert ( varchar ( 10 ), dateadd (hour, number , @begdate ), 112 ) as [ date ] , convert ( varchar ( 10 ), dateadd (hour, number , @begdate ), 108 ) + ' - ' + convert ( varchar ( 10 ), dateadd (hour, number + 1 , @begdate ), 108 ) as [ time ] , null as [ name ] from master.dbo.spt_values where type = ' P ' and dateadd (hour, number , @begdate ) <= dateadd (hour, 18 , @enddate ) and convert ( varchar ( 10 ), dateadd (hour, number , @begdate ), 108 ) >= ' 08:00 ' and convert ( varchar ( 10 ), dateadd (hour, number , @enddate ), 108 ) <= ' 18:00 ' ) t left join ( select convert ( varchar ( 10 ), dateadd (hour,r. number , @begdate ), 112 ) as [ date ] , convert ( varchar ( 10 ), dateadd (hour, number , @begdate ), 108 ) + ' - ' + convert ( varchar ( 10 ), dateadd (hour, number + 1 , @begdate ), 108 ) as [ time ] , h.name from master.dbo.spt_values r , @table h where type = ' P ' and convert ( varchar ( 10 ), dateadd (hour, number , @begdate ), 108 ) >= h. [ starttime ] and convert ( varchar ( 10 ), dateadd (hour, number , @enddate ), 108 ) <= h. [ overtime ] and convert ( varchar ( 10 ), dateadd (hour,r. number , @begdate ), 112 ) = h. [ day ] ) u on t. [ date ] = u. [ date ] and t. [ time ] = u. [ time ] -- select * from #temp declare @sql varchar ( 8000 ) select @sql = '' select @sql = @sql + ' ,max(case [date] when ' + [ date ] + ' then name else null end) as [ ' + ltrim ( datename (weekday, [ date ] )) + ' ] ' from ( select distinct [ date ] from # temp ) t select @sql = ' select [time] ' + @sql + ' from #temp group by [time] ' -- print @sql exec ( @sql ) drop table # temp
 
#7楼 得分:0回复于:2010-01-02 16:52:27
引用用户输入一个时间段 ,比如开始时间 2009-12-1 结束时间 2009-12-30 这样。
可以通过你的程序来实现这个SQL语句啊。并不复杂,你可以参考一下精华贴中的行转列。然后再 union一个汇总。
 
  • liangCK用户头像
  • liangCK
  • (小梁爱兰儿..只爱兰.!❤)
  • 等 级:
  • 2

    2

#8楼 得分:5回复于:2010-01-02 17:03:32
SQL code
            
-- ----------------------------------- -- Author : liangCK 梁爱兰 -- Comment: 小梁 爱 兰儿 -- Date : 2010-01-02 16:47:10 -- ----------------------------------- -- > 生成测试数据: #tb CREATE TABLE #tb(列名1 varchar ( 12 ),时间 datetime ) INSERT INTO #tb SELECT ' 03174190188 ' , ' 2009-11-01 07:17:39.217 ' UNION ALL SELECT ' 015224486575 ' , ' 2009-11-01 08:01:17.153 ' UNION ALL SELECT ' 013593006926 ' , ' 2009-11-12 08:04:46.560 ' UNION ALL SELECT ' 013599584239 ' , ' 2009-11-22 08:53:27.763 ' UNION ALL SELECT ' 013911693526 ' , ' 2009-11-23 08:53:51.683 ' UNION ALL SELECT ' 013846472440 ' , ' 2009-11-23 08:54:57.233 ' UNION ALL SELECT ' 013990353697 ' , ' 2009-11-24 08:55:25.077 ' UNION ALL SELECT ' 013990353697 ' , ' 2009-11-25 08:56:01.327 ' UNION ALL SELECT ' 013945594843 ' , ' 2009-11-26 08:57:02.233 ' UNION ALL SELECT ' 013990353697 ' , ' 2009-11-27 08:57:29.700 ' UNION ALL SELECT ' 013916597421 ' , ' 2009-11-28 08:59:49.390 ' UNION ALL SELECT ' 03916995857 ' , ' 2009-11-29 09:11:05.607 ' UNION ALL SELECT ' 015097712001 ' , ' 2009-11-30 09:13:50.293 ' -- SQL查询如下: DECLARE @minDate datetime , @maxDate datetime ; SELECT @minDate = ' 2009-11-1 ' , @maxDate = ' 2009-12-01 ' ; DECLARE @sql varchar ( 8000 ); SET @sql = '' ; SELECT @sql = @sql + ' ,SUM(CASE WHEN DATEDIFF(day,B.时间, ''' + CONVERT ( varchar ( 10 ), DATEADD ( day , number , @minDate ), 120 ) + ''' )=0 THEN 1 ELSE 0 END) AS [ ' + CONVERT ( varchar ( 10 ), DATEADD ( day , number , @minDate ), 120 ) + ' ] ' FROM master.dbo.spt_values WHERE type = ' P ' AND DATEADD ( day , number , @minDate ) <= @maxDate ; DECLARE @cmd nvarchar ( 4000 ); SET @cmd = N ' SELECT ISNULL(A.时段, '' 合计 '' ) AS 时段 ' + @sql + ' , COUNT(列名1) AS 合计 FROM( SELECT 时段=RIGHT(100+number,2)+ '' :00~ '' +RIGHT(100+number+1,2)+ '' :00 '' , MinDate = RIGHT(100+number,2)+ '' :00:00 '' , MaxDate = RIGHT(100+number+1,2)+ '' :00:00 '' FROM master.dbo.spt_values WHERE type = '' P '' AND number < 24 ) AS A LEFT JOIN (SELECT * FROM #tb WHERE 时间 BETWEEN @minDate AND @maxDate) AS B ON CONVERT(varchar(8),B.时间,108) >= A.MinDate AND CONVERT(varchar(8),B.时间,108) < A.MaxDate GROUP BY A.时段 WITH ROLLUP; ' EXEC sp_executesql @cmd ,N ' @minDate datetime,@maxDate datetime ' , @minDate , @maxDate ; DROP TABLE #tb;
 
  • liangCK用户头像
  • liangCK
  • (小梁爱兰儿..只爱兰.!❤)
  • 等 级:
  • 2

    2

#9楼 得分:1回复于:2010-01-02 17:03:46
SQL code
            
时段 2009 - 11 - 01 2009 - 11 - 02 2009 - 11 - 03 2009 - 11 - 04 2009 - 11 - 05 2009 - 11 - 06 2009 - 11 - 07 2009 - 11 - 08 2009 - 11 - 09 2009 - 11 - 10 2009 - 11 - 11 2009 - 11 - 12 2009 - 11 - 13 2009 - 11 - 14 2009 - 11 - 15 2009 - 11 - 16 2009 - 11 - 17 2009 - 11 - 18 2009 - 11 - 19 2009 - 11 - 20 2009 - 11 - 21 2009 - 11 - 22 2009 - 11 - 23 2009 - 11 - 24 2009 - 11 - 25 2009 - 11 - 26 2009 - 11 - 27 2009 - 11 - 28 2009 - 11 - 29 2009 - 11 - 30 2009 - 12 - 01 合计 00 : 00 ~ 01 : 00 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 01 : 00 ~ 02 : 00 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 02 : 00 ~ 03 : 00 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 03 : 00 ~ 04 : 00 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 04 : 00 ~ 05 : 00 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 05 : 00 ~ 06 : 00 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 06 : 00 ~ 07 : 00 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 07 : 00 ~ 08 : 00 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 08 : 00 ~ 09 : 00 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 2 1 1 1 1 1 0 0 0 10 09 : 00 ~ 10 : 00 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 2 10 : 00 ~ 11 : 00 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 11 : 00 ~ 12 : 00 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 : 00 ~ 13 : 00 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 13 : 00 ~ 14 : 00 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 14 : 00 ~ 15 : 00 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 15 : 00 ~ 16 : 00 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 16 : 00 ~ 17 : 00 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 17 : 00 ~ 18 : 00 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 18 : 00 ~ 19 : 00 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 19 : 00 ~ 20 : 00 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 20 : 00 ~ 21 : 00 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 21 : 00 ~ 22 : 00 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 22 : 00 ~ 23 : 00 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 23 : 00 ~ 24 : 00 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 合计 2 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 2 1 1 1 1 1 1 1 0 13
 
#10楼 得分:0回复于:2010-01-02 18:17:20
感谢上面的的热心朋友,8楼的代码很好,但是我发现如果用户输入时间段比较长就麻烦了,我想用时间段做为列,怎么改呢?
我是新手,不会弄,没看懂原理。
 
#11楼 得分:0回复于:2010-01-02 20:58:25
引用 8 楼 liangck 的回复:
SQL code-------------------------------------
--  Author : liangCK 梁爱兰
--  Comment: 小梁 爱 兰儿
--  Date  : 2010-01-02 16:47:10
---------------------------------------> 生成测试数据: #tbCREATETABLE #tb(列名1varc?-


我是新手,不会弄,再帮我把行转为列!谢谢了!
 
  • josy用户头像
  • josy
  • (百年树人)
  • 等 级:
#12楼 得分:0回复于:2010-01-02 21:00:02
引用 11 楼 pupstar 的回复:
引用 8 楼 liangck 的回复:
SQL code-------------------------------------
--  Author : liangCK 梁爱兰
--  Comment: 小梁 爱 兰儿
--  Date  : 2010-01-02 16:47:10
---------------------------------------> 生成测试数据: #tbCREATETABLE #tb(列名1varc?-


我是新手,不会弄,再帮我把行转为列!谢谢了!


结果的显示形式是怎么样的?
 
#13楼 得分:0回复于:2010-01-02 21:07:59
              00:00~01:00 01:00~02:00 ……  23:00~24:00  合计
2009-11-01        12          1            13          26
2009-11-02        2            2            0          4
……
2009-11-30        2            3            0          2
合计                100        200            200        2222

帮忙改为这样!
大家帮忙啊! 谢谢
 
  • lg314用户头像
  • lg314
  • (lg314)
  • 等 级:
#14楼 得分:0回复于:2010-01-02 21:10:28
数据库版本是多少?
 
#15楼 得分:0回复于:2010-01-02 21:11:42
数据库是 sql 2000 的!
 
#16楼 得分:0回复于:2010-01-02 21:19:59
8楼写的这么好了,还不结贴,真是的。
 
#17楼 得分:0回复于:2010-01-02 21:25:06
那位再帮我把行和列转一下就结贴了!谢谢大家再帮帮忙,我弄了一下午没弄成!
 
#18楼 得分:0回复于:2010-01-02 21:30:52
这样就更简单了。
 
#19楼 得分:0回复于:2010-01-02 21:32:03
简单就贴一下代码吧!谢谢了!
 
#20楼 得分:0回复于:2010-01-02 21:36:16
引用 13 楼 pupstar 的回复:
              00:00~01:00 01:00~02:00 ……  23:00~24:00  合计
2009-11-01        12          1            13          26
2009-11-02        2            2            0          4
……
2009-11-30        2            3            0          2
合计                100        200            200        2222

帮忙改为这样!
大家帮忙啊! 谢谢


这个只要直接case when +分组了呀
 
#21楼 得分:4回复于:2010-01-02 21:43:24
SQL code
            
-- ----------------------------------- -- Author : liangCK 梁爱兰 -- Comment: 小梁 爱 兰儿 -- Date : 2010-01-02 16:47:10 -- ----------------------------------- -- > 生成测试数据: #tb CREATE TABLE #tb(列名1 varchar ( 12 ),时间 datetime ) INSERT INTO #tb SELECT ' 03174190188 ' , ' 2009-11-01 07:17:39.217 ' UNION ALL SELECT ' 015224486575 ' , ' 2009-11-01 08:01:17.153 ' UNION ALL SELECT ' 013593006926 ' , ' 2009-11-12 08:04:46.560 ' UNION ALL SELECT ' 013599584239 ' , ' 2009-11-22 08:53:27.763 ' UNION ALL SELECT ' 013911693526 ' , ' 2009-11-23 08:53:51.683 ' UNION ALL SELECT ' 013846472440 ' , ' 2009-11-23 08:54:57.233 ' UNION ALL SELECT ' 013990353697 ' , ' 2009-11-24 08:55:25.077 ' UNION ALL SELECT ' 013990353697 ' , ' 2009-11-25 08:56:01.327 ' UNION ALL SELECT ' 013945594843 ' , ' 2009-11-26 08:57:02.233 ' UNION ALL SELECT ' 013990353697 ' , ' 2009-11-27 08:57:29.700 ' UNION ALL SELECT ' 013916597421 ' , ' 2009-11-28 08:59:49.390 ' UNION ALL SELECT ' 03916995857 ' , ' 2009-11-29 09:11:05.607 ' UNION ALL SELECT ' 015097712001 ' , ' 2009-11-30 09:13:50.293 ' -- SQL查询如下: DECLARE @minDate datetime , @maxDate datetime ; SELECT @minDate = ' 2009-11-1 ' , @maxDate = ' 2009-12-01 ' ; DECLARE @sql varchar ( 8000 ); SET @sql = '' ; SELECT @sql = @sql + ' ,SUM(CASE WHEN CONVERT(varchar(8),时间,108) >= ''' +RIGHT ( 100 + number , 2 ) + ' :00:00 '' AND CONVERT(varchar(8),时间,108) < ''' +RIGHT ( 100 + number + 1 , 2 ) + ' :00:00 '' THEN 1 ELSE 0 END) AS [ ' +RIGHT ( 100 + number , 2 ) + ' :00- ' +RIGHT ( 100 + number + 1 , 2 ) + ' :00] ' FROM master.dbo.spt_values WHERE type = ' P ' AND number < 24 ; DECLARE @cmd nvarchar ( 4000 ); SET @cmd = N ' SELECT ISNULL(CONVERT(varchar(10),时间,120), '' 合计 '' ) AS 时段 ' + @sql + ' , COUNT(列名1) AS 合计 FROM #tb WHERE 时间 BETWEEN @minDate AND @maxDate GROUP BY CONVERT(varchar(10),时间,120) WITH ROLLUP; ' ; EXEC sp_executesql @cmd ,N ' @minDate datetime,@maxDate datetime ' , @minDate , @maxDate ; DROP TABLE #tb;
 
  • z_q_l用户头像
  • z_q_l
  • (z_q_l)
  • 等 级:
#22楼 得分:0回复于:2010-01-02 22:06:08
up  up
 
#23楼 得分:0回复于:2010-01-02 22:21:30
21楼的 报错:
服务器: 消息 8120,级别 16,状态 1,行 1
列 '#tb.时间' 在选择列表中无效,因为该列既不包含在聚合函数中,也不包含在 GROUP BY 子句中。
 
#24楼 得分:0回复于:2010-01-02 22:26:13
引用 23 楼 pupstar 的回复:
21楼的 报错:
服务器: 消息 8120,级别 16,状态 1,行 1
列 '#tb.时间' 在选择列表中无效,因为该列既不包含在聚合函数中,也不包含在 GROUP BY 子句中。



你改过代码吧。
 
#25楼 得分:0回复于:2010-01-02 22:29:20
直接 ctrl+c  ctrl+v 的呀! 你可以运行一下试试!
 
#26楼 得分:4回复于:2010-01-02 22:35:56
引用 25 楼 pupstar 的回复:
直接 ctrl+c  ctrl+v 的呀! 你可以运行一下试试!


SQL code
            
-- ----------------------------------- -- Author : liangCK 梁爱兰 -- Comment: 小梁 爱 兰儿 -- Date : 2010-01-02 16:47:10 -- ----------------------------------- -- > 生成测试数据: #tb CREATE TABLE #tb(列名1 varchar ( 12 ),时间 datetime ) INSERT INTO #tb SELECT ' 03174190188 ' , ' 2009-11-01 07:17:39.217 ' UNION ALL SELECT ' 015224486575 ' , ' 2009-11-01 08:01:17.153 ' UNION ALL SELECT ' 013593006926 ' , ' 2009-11-12 08:04:46.560 ' UNION ALL SELECT ' 013599584239 ' , ' 2009-11-22 08:53:27.763 ' UNION ALL SELECT ' 013911693526 ' , ' 2009-11-23 08:53:51.683 ' UNION ALL SELECT ' 013846472440 ' , ' 2009-11-23 08:54:57.233 ' UNION ALL SELECT ' 013990353697 ' , ' 2009-11-24 08:55:25.077 ' UNION ALL SELECT ' 013990353697 ' , ' 2009-11-25 08:56:01.327 ' UNION ALL SELECT ' 013945594843 ' , ' 2009-11-26 08:57:02.233 ' UNION ALL SELECT ' 013990353697 ' , ' 2009-11-27 08:57:29.700 ' UNION ALL SELECT ' 013916597421 ' , ' 2009-11-28 08:59:49.390 ' UNION ALL SELECT ' 03916995857 ' , ' 2009-11-29 09:11:05.607 ' UNION ALL SELECT ' 015097712001 ' , ' 2009-11-30 09:13:50.293 ' -- SQL查询如下: DECLARE @minDate datetime , @maxDate datetime ; SELECT @minDate = ' 2009-11-1 ' , @maxDate = ' 2009-12-01 ' ; select convert ( char ( 10 ), dateadd (d, number , @minDate ), 120 ), sum ( case when convert ( char ( 8 ),时间, 108 ) between ' 00:00 ' and ' 01:00 ' then 1 else 0 end ) as ' 00:00~01:00 ' , sum ( case when convert ( char ( 8 ),时间, 108 ) between ' 01:00 ' and ' 02:00 ' then 1 else 0 end ) as ' 01:00~02:00 ' , sum ( case when convert ( char ( 8 ),时间, 108 ) between ' 02:00 ' and ' 03:00 ' then 1 else 0 end ) as ' 02:00~03:00 ' , sum ( case when convert ( char ( 8 ),时间, 108 ) between ' 03:00 ' and ' 04:00 ' then 1 else 0 end ) as ' 03:00~04:00 ' , sum ( case when convert ( char ( 8 ),时间, 108 ) between ' 04:00 ' and ' 05:00 ' then 1 else 0 end ) as ' 04:00~05:00 ' , sum ( case when convert ( char ( 8 ),时间, 108 ) between ' 05:00 ' and ' 06:00 ' then 1 else 0 end ) as ' 05:00~06:00 ' , sum ( case when convert ( char ( 8 ),时间, 108 ) between ' 06:00 ' and ' 07:00 ' then 1 else 0 end ) as ' 06:00~07:00 ' , sum ( case when convert ( char ( 8 ),时间, 108 ) between ' 07:00 ' and ' 08:00 ' then 1 else 0 end ) as ' 07:00~08:00 ' , sum ( case when convert ( char ( 8 ),时间, 108 ) between ' 08:00 ' and ' 09:00 ' then 1 else 0 end ) as ' 08:00~09:00 ' , count (a.列名1) as ' sum ' from #tb a right join master..spt_values b on datediff (d,时间, dateadd (d, number , @minDate )) = 0 where dateadd (d, number , @minDate ) <= @maxDate and b.type = ' p ' and b. number >= 0 group by convert ( char ( 10 ), dateadd (d, number , @minDate ), 120 ) order by 1 drop table #tb ( 13 行受影响) 00 : 00 ~ 01 : 00 01 : 00 ~ 02 : 00 02 : 00 ~ 03 : 00 03 : 00 ~ 04 : 00 04 : 00 ~ 05 : 00 05 : 00 ~ 06 : 00 06 : 00 ~ 07 : 00 07 : 00 ~ 08 : 00 08 : 00 ~ 09 : 00 sum -- -------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- 2009 - 11 - 01 0 0 0 0 0 0 0 1 1 2 2009 - 11 - 02 0 0 0 0 0 0 0 0 0 0 2009 - 11 - 03 0 0 0 0 0 0 0 0 0 0 2009 - 11 - 04 0 0 0 0 0 0 0 0 0 0 2009 - 11 - 05 0 0 0 0 0 0 0 0 0 0 2009 - 11 - 06 0 0 0 0 0 0 0 0 0 0 2009 - 11 - 07 0 0 0 0 0 0 0 0 0 0 2009 - 11 - 08 0 0 0 0 0 0 0 0 0 0 2009 - 11 - 09 0 0 0 0 0 0 0 0 0 0 2009 - 11 - 10 0 0 0 0 0 0 0 0 0 0 2009 - 11 - 11 0 0 0 0 0 0 0 0 0 0 2009 - 11 - 12 0 0 0 0 0 0 0 0 1 1 2009 - 11 - 13 0 0 0 0 0 0 0 0 0 0 2009 - 11 - 14 0 0 0 0 0 0 0 0 0 0 2009 - 11 - 15 0 0 0 0 0 0 0 0 0 0 2009 - 11 - 16 0 0 0 0 0 0 0 0 0 0 2009 - 11 - 17 0 0 0 0 0 0 0 0 0 0 2009 - 11 - 18 0 0 0 0 0 0 0 0 0 0 2009 - 11 - 19 0 0 0 0 0 0 0 0 0 0 2009 - 11 - 20 0 0 0 0 0 0 0 0 0 0 2009 - 11 - 21 0 0 0 0 0 0 0 0 0 0 2009 - 11 - 22 0 0 0 0 0 0 0 0 1 1 2009 - 11 - 23 0 0 0 0 0 0 0 0 2 2 2009 - 11 - 24 0 0 0 0 0 0 0 0 1 1 2009 - 11 - 25 0 0 0 0 0 0 0 0 1 1 2009 - 11 - 26 0 0 0 0 0 0 0 0 1 1 2009 - 11 - 27 0 0 0 0 0 0 0 0 1 1 2009 - 11 - 28 0 0 0 0 0 0 0 0 1 1 2009 - 11 - 29 0 0 0 0 0 0 0 0 0 1 2009 - 11 - 30 0 0 0 0 0 0 0 0 0 1 2009 - 12 - 01 0 0 0 0 0 0 0 0 0 0 警告: 聚合或其他 SET 操作消除了空值。 ( 31 行受影响)
 
#27楼 得分:0回复于:2010-01-02 23:01:28
楼上的可以实现了,就是少个合计了!明天上午结贴!谢谢大家热心帮助,我非常感谢。
 
  • josy用户头像
  • josy
  • (百年树人)
  • 等 级:
#28楼 得分:0回复于:2010-01-02 23:02:35
引用 27 楼 pupstar 的回复:
楼上的可以实现了,就是少个合计了!明天上午结贴!谢谢大家热心帮助,我非常感谢。


最后面的sum不是合计么?
 
#29楼 得分:4回复于:2010-01-02 23:05:07
SQL code
            
-- ----------------------------------- -- Author : liangCK 梁爱兰 -- Comment: 小梁 爱 兰儿 -- Date : 2010-01-02 16:47:10 -- ----------------------------------- -- > 生成测试数据: #tb CREATE TABLE #tb(列名1 varchar ( 12 ),时间 datetime ) INSERT INTO #tb SELECT ' 03174190188 ' , ' 2009-11-01 07:17:39.217 ' UNION ALL SELECT ' 015224486575 ' , ' 2009-11-01 08:01:17.153 ' UNION ALL SELECT ' 013593006926 ' , ' 2009-11-12 08:04:46.560 ' UNION ALL SELECT ' 013599584239 ' , ' 2009-11-22 08:53:27.763 ' UNION ALL SELECT ' 013911693526 ' , ' 2009-11-23 08:53:51.683 ' UNION ALL SELECT ' 013846472440 ' , ' 2009-11-23 08:54:57.233 ' UNION ALL SELECT ' 013990353697 ' , ' 2009-11-24 08:55:25.077 ' UNION ALL SELECT ' 013990353697 ' , ' 2009-11-25 08:56:01.327 ' UNION ALL SELECT ' 013945594843 ' , ' 2009-11-26 08:57:02.233 ' UNION ALL SELECT ' 013990353697 ' , ' 2009-11-27 08:57:29.700 ' UNION ALL SELECT ' 013916597421 ' , ' 2009-11-28 08:59:49.390 ' UNION ALL SELECT ' 03916995857 ' , ' 2009-11-29 09:11:05.607 ' UNION ALL SELECT ' 015097712001 ' , ' 2009-11-30 09:13:50.293 ' -- SQL查询如下: DECLARE @minDate datetime , @maxDate datetime ; SELECT @minDate = ' 2009-11-1 ' , @maxDate = ' 2009-12-01 ' ; select isnull ( convert ( char ( 10 ), dateadd (d, number , @minDate ), 120 ), ' sum ' ), sum ( case when convert ( char ( 8 ),时间, 108 ) between ' 00:00 ' and ' 01:00 ' then 1 else 0 end ) as ' 00:00~01:00 ' , sum ( case when convert ( char ( 8 ),时间, 108 ) between ' 01:00 ' and ' 02:00 ' then 1 else 0 end ) as ' 01:00~02:00 ' , sum ( case when convert ( char ( 8 ),时间, 108 ) between ' 02:00 ' and ' 03:00 ' then 1 else 0 end ) as ' 02:00~03:00 ' , sum ( case when convert ( char ( 8 ),时间, 108 ) between ' 03:00 ' and ' 04:00 ' then 1 else 0 end ) as ' 03:00~04:00 ' , sum ( case when convert ( char ( 8 ),时间, 108 ) between ' 04:00 ' and ' 05:00 ' then 1 else 0 end ) as ' 04:00~05:00 ' , sum ( case when convert ( char ( 8 ),时间, 108 ) between ' 05:00 ' and ' 06:00 ' then 1 else 0 end ) as ' 05:00~06:00 ' , sum ( case when convert ( char ( 8 ),时间, 108 ) between ' 06:00 ' and ' 07:00 ' then 1 else 0 end ) as ' 06:00~07:00 ' , sum ( case when convert ( char ( 8 ),时间, 108 ) between ' 07:00 ' and ' 08:00 ' then 1 else 0 end ) as ' 07:00~08:00 ' , sum ( case when convert ( char ( 8 ),时间, 108 ) between ' 08:00 ' and ' 09:00 ' then 1 else 0 end ) as ' 08:00~09:00 ' , count (a.列名1) as ' sum ' from #tb a right join master..spt_values b on datediff (d,时间, dateadd (d, number , @minDate )) = 0 where dateadd (d, number , @minDate ) <= @maxDate and b.type = ' p ' and b. number >= 0 group by convert ( char ( 10 ), dateadd (d, number , @minDate ), 120 ) with rollup order by 1 drop table #tb 00 : 00 ~ 01 : 00 01 : 00 ~ 02 : 00 02 : 00 ~ 03 : 00 03 : 00 ~ 04 : 00 04 : 00 ~ 05 : 00 05 : 00 ~ 06 : 00 06 : 00 ~ 07 : 00 07 : 00 ~ 08 : 00 08 : 00 ~ 09 : 00 sum -- -------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- 2009 - 11 - 01 0 0 0 0 0 0 0 1 1 2 2009 - 11 - 02 0 0 0 0 0 0 0 0 0 0 2009 - 11 - 03 0 0 0 0 0 0 0 0 0 0 2009 - 11 - 04 0 0 0 0 0 0 0 0 0 0 2009 - 11 - 05 0 0 0 0 0 0 0 0 0 0 ...... 2009 - 11 - 28 0 0 0 0 0 0 0 0 1 1 2009 - 11 - 29 0 0 0 0 0 0 0 0 0 1 2009 - 11 - 30 0 0 0 0 0 0 0 0 0 1 2009 - 12 - 01 0 0 0 0 0 0 0 0 0 0 sum 0 0 0 0 0 0 0 1 10 13 ( 32 行受影响)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值