2013-12-15 175 views
5

我有一个名为MusicTrack的表,其中包含MusicTrackID,TrackName和Duration列。SQL服务器聚合函数查询

我使用的查询:

Select Cast(DateAdd(ms,SUM(DateDiff(ms, '00:00:00', Duration)), '00:00:00') as time) 
as 'Total duration' from 
    MusicTrack where MusicTrackID = '1' or MusicTrackID = '3' 

这个查询增加了2所选音乐的持续时间跟踪在一起,并将其显示在名为总时长一个临时列。 '持续时间'是数据类型时间,所以我将它转换为整数,然后再返回。

我的问题:我能调整查询的方式还包括TrackName字段和运行总持续时间?或者包括临时列和TrackName列。

,从而显示将有TRACKNAME和总时间... ...线沿线的:我想只是包括TRACKNAME列本查询

TrackName Duration Total duration 

Name1  00:03:00  00:03:00 
Name2  00:03:01  00:06:01 

,但它不工作:

Select TrackName, Cast(....) From MusicTrack where MusicTrackID = '1' or MusicTrackID = '3' 
+1

研究 “运行总计” 中的SQL –

回答

2

尝试下面

我创建一个试样台

SELECT * INTO TMPTIME 
FROM (
SELECT 1 AS ID ,'Name1' AS NAME,'00:03:00' AS T  
UNION 
SELECT 2 AS ID,'Name2' AS NAME,'00:03:01' AS T  
UNION 
SELECT 3 AS ID,'Name3' AS NAME,'00:03:02' AS T 
UNION 
SELECT 4 AS ID,'Name4' AS NAME,'00:03:41' AS T  
)TMP 

输出查询

SELECT ID,NAME, T AS TIME, 
(SELECT 
cast(DATEADD(ms, SUM(DATEDIFF(ms, '00:00:00.000', cast (t as time))), '00:00:00.000') as time) 
FROM TMPTIME T1 WHERE T1.ID<=TMPTIME.ID 
) AS TOTAL 

FROM TMPTIME 

结果

ID NAME TIME TOTAL 
1 Name1 00:03:00 00:03:00.0000000 
2 Name2 00:03:01 00:06:01.0000000 
3 Name3 00:03:02 00:09:03.0000000 
4 Name4 00:03:41 00:12:44.0000000 
0

sqlFiddle的SQL Server(不是MySQL的)

SELECT TrackName, Duration, Cast(DateAdd(ms,RunningTotal,'00:00:00') as time) as 'Total Duration' 
FROM 
(SELECT TrackName, Duration, 
    SUM(DateDiff(ms,'00:00:00',Duration)) OVER(ORDER BY MusicTrackId 
    ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) 
     AS RunningTotal 
    FROM MusicTrack 
    WHERE MusicTrackId IN (1,3) 
)T 

语法这里找到running total

对于MySQL sqlFiddle,(不是SQL Server)的

SELECT TrackName,Date_Format(Duration,'%k:%i:%s') as Duration, 
       Date_Format(runningTotal,'%k:%i:%s') as 'Total Duration' 
FROM 
    (SELECT TrackName, Duration, 
      Sec_To_Time(@total:[email protected] + Time_To_Sec(Duration)) as runningTotal 
    FROM MusicTrack,(SELECT @total:='00:00:00')T 
    WHERE MusicTrackId IN (1,3) 
    ORDER BY MusicTrackId 
)Result