当前位置: 代码迷 >> Sql Server >> 求解:每10分钟里,Score的总数,和A出现的次数
  详细解决方案

求解:每10分钟里,Score的总数,和A出现的次数

热度:101   发布时间:2016-04-24 09:17:03.0
求解:每10分钟里,Score的总和,和A出现的次数
有如下表,table1:
Time;  Score;  Class
07:59:00; 100; A
08:00:00; 10; A
08:01:00; 10; B
08:02:00; 90; A
08:02:00; 90; C
08:04:00; 80; C
08:09:00; 20; A
08:10:00; 100; B
08:12:00; 50; A
08:18:00; 50; C
08:24:00; 80; C
08:27:00; 10; C
08:37:00; 10; C
...
要返回从08:00:00 开始到12:00:00结束的每10分钟里,Score的总和,和A出现的次数:

Time;  Score;  Class
08:00; 300; 3
08:10; 200; 1
08:20; 90; 0
------解决思路----------------------
Declare @TmpData Table(
Times NVarchar(10),
Scores Int,
Class NVarchar(10))

Select (SUBSTRING(Times,1,2)*60 + SUBSTRING(Times,4,2))/10 As BidTime,SUM(Scores) As TotalScores,SUM(Case Class When N'A' Then 1 Else 0 End) As Class
From @TmpData
Where (SUBSTRING(Times,1,2)*60 + SUBSTRING(Times,4,2)) Between 480 And 720
Group By (SUBSTRING(Times,1,2)*60 + SUBSTRING(Times,4,2))/10

--(SUBSTRING(Times,1,2)*60 + SUBSTRING(Times,4,2))/10表示将每个10分钟作为一个分段,标注ID,从0开始
------解决思路----------------------
DECLARE @Start DATETIME,@End DATETIME
SET @Start='08:00:00'
SET @End='12:00:00'
SELECT CONVERT(VARCHAR(8),DATEADD(MINUTE,T1.number*10,@Start),108)[Time]
,ISNULL(SUM(T2.Score),0)[Score]
,COUNT(CASE WHEN T2.Class='A'THEN 1 END)
FROM master..spt_values T1
LEFT JOIN table1 T2 ON T1.number=(DATEDIFF(MINUTE,@Start,T2.[Time]))/10
AND T2.[Time] BETWEEN @Start AND @End
WHERE T1.type='P'AND T1.number<=DATEDIFF(MINUTE,@Start,@End)/10
GROUP BY CONVERT(VARCHAR(8),DATEADD(MINUTE,T1.number*10,@Start),108)
ORDER BY [Time]
  相关解决方案