当前位置: 代码迷 >> Sql Server >> sqlserver查询每一个钟头的数据
  详细解决方案

sqlserver查询每一个钟头的数据

热度:78   发布时间:2016-04-24 09:50:36.0
sqlserver查询每一个小时的数据
首先看表

查询要求:查询每一天每一个小时的数据
比如 按照[StartTime]划分为四天 ,然后统计每一个小时的数据  每一个id对应的是一条数据
日期\小时     0   1  2  3  4  5  6  7  8   9  10  11  12  13  14  15  16  17  18  19  20  21   22  23 
2014-08-18                                                       1
2014-08-19                                                       1           
2014-08-20                                            1    0    1   0    0     1
2014-08-21                                         1  0   0   0    1
最后按照时间排序  8-21的要排在第一 8-18的排在最后
这个查询比较复杂 求高手指导 多谢了  百度很久了 
目前只能够写出一条不能够满足要求的语句  
declare @sql nvarchar(max) 
select @sql=stuff((select ','+quotename(convert(varchar,number)) 
from master..spt_values  where type='P' and number<24 for xml path('')) ,1,1,'') 
set @sql='select top 2* from (select ID,datepart(hh,[StartTime])time,count(ID)sc 
from [QUMobMobilePaySdk].[dbo].[QPS_SyncTasks] 
where [SyncType]=1 group by ID,datepart(hh,[StartTime]))t pivot (sum(sc) 
for time in ('+@sql+'))a' exec(@sql)

------解决思路----------------------
oracle的写法,参考下思路吧
SELECT TO_CHAR(TIME,'YYYY-MM-DD') AS 日期,
SUM(DECODE(TO_CHAR(TIME,'HH24'),'00',1)) AS "0",
SUM(DECODE(TO_CHAR(TIME,'HH24'),'01',1)) AS "1",
……
SUM(DECODE(TO_CHAR(TIME,'HH24'),'24',1)) AS "24",
FROM T
GROUP BY TO_CHAR(TIME,'YYYY-MM-DD')
order by min(TO_CHAR(TIME,'HH24'))

------解决思路----------------------
我写一个MSSQL的~~
DECLARE @SQL VARCHAR(8000)
SET @SQL='SELECT CONVERT(VARCHAR(10),[StartTime],120)[日期\小时]'

DECLARE @INDEX INT
SET @INDEX=1
WHILE @INDEX<=24
BEGIN
SET @SQL=@SQL+',SUM(CASE WHEN DATEPART(HH,[StartTime])='+CAST(@INDEX AS VARCHAR(2))+' THEN 1 END)['+CAST(@INDEX AS VARCHAR(2))+']'
SET @INDEX=@INDEX+1
END
SET @SQL=@SQL+'FROM[QPS_SyncTasks]GROUP BY CONVERT(VARCHAR(10),[StartTime],120)ORDER BY[日期\小时]DESC'
EXEC(@SQL)

------解决思路----------------------

declare @sql nvarchar(max) 
select @sql=stuff((select ','+quotename(convert(varchar,number)) 
from master..spt_values  where type='P' and number<24 for xml path('')) ,1,1,'') 
set @sql='select top 2* from (select  convert(varchar(10), [StartTime],120) as [日期\小时],datepart(hh,[StartTime]) [time],count(ID)sc 
from [QUMobMobilePaySdk].[dbo].[QPS_SyncTasks] 
where [SyncType]=1 group by convert(varchar(10), [StartTime],120),datepart(hh,[StartTime]))t pivot (sum(sc) 
for time in ('+@sql+'))a' 
--exec(@sql) 
print @sql
  相关解决方案