SQL Server聚合函数查询

5

我有一个名为MusicTrack的表格,包含MusicTrackID、TrackName和Duration三列。

我正在使用以下查询语句:

    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'

这个查询将选定的两个音乐曲目的持续时间相加,并在一个名为“总持续时间”的临时列中显示。 “Duration”是Time数据类型,因此我将其转换为整数,然后再转回去。
我的问题是:我如何改变查询方式,以便还包括TrackName字段和持续时间的累计总和?或者包括临时列以及TrackName列。
这样显示就会有TrackName和Total duration... 大致如下:
TrackName   Duration   Total duration

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

我尝试仅将TrackName列包含在查询中,像这样:但它不起作用:
Select TrackName, Cast(....) From MusicTrack  where MusicTrackID = '1' or MusicTrackID = '3'

1
在SQL中研究“累计总数”。 - Yuriy Galanter
2个回答

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:=@total + Time_To_Sec(Duration)) as runningTotal
   FROM MusicTrack,(SELECT @total:='00:00:00')T
   WHERE MusicTrackId IN (1,3)
   ORDER BY MusicTrackId
  )Result

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接