2013-12-15 16 views
5

Ich habe eine Tabelle namens MusicTrack mit den Spalten MusicTrackID, TrackName und Duration.SQL Server Aggregat Funktion Abfrage

Ich bin mit der Abfrage:

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' 

Diese Abfrage fügt die Dauer der 2 ausgewählten Musikstücke zusammen und zeigt sie in einer temporären Spalte Gesamtdauer genannt. Die 'Duration' hat den Datentyp Time, also wandle ich sie in Integer und wieder zurück.

Meine Frage: Wie kann ich die Abfrage so anpassen, dass sie auch das TrackName-Feld und eine laufende Gesamtdauer enthält? Oder schließen Sie die temporäre Spalte und die TrackName-Spalte ein.

Damit die Anzeige Streckennamen und Gesamtdauer hat ... entlang der Linien von:

TrackName Duration Total duration 

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

Ich versuchte zu zählen nur die Streckennamen Spalt auf die Abfrage so, aber es funktioniert nicht:

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

Forschung "laufende Summe" in SQL –

Antwort

2

versuchen unter

i erstellt eine Beispieltabelle

Ausgangs Abfrage

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 

Ergebnis

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 für SQL Server (nicht 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 

Syntax hier running total

für 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