【问题标题】:SQL server aggregate function querySQL server 聚合函数查询
【发布时间】:2013-12-15 04:43:46
【问题描述】:

我有一个名为 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'

此查询将 2 个选定音乐曲目的持续时间相加,并将其显示在名为总持续时间的临时列中。 “持续时间”的数据类型为时间,因此我将其转换为整数并再次转换回来。

我的问题:我可以通过什么方式调整查询以包括 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'

【问题讨论】:

  • 在SQL中研究“running total”

标签: mysql sql sql-server


【解决方案1】:

下面试试

我创建了一个示例表

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

【讨论】:

    【解决方案2】:

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-08-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-05
      • 2011-09-27
      • 2013-04-25
      相关资源
      最近更新 更多