2013-12-15 20 views
5

Mam tabelę o nazwie MusicTrack z kolumnami MusicTrackID, TrackName i Duration.Zapytanie o funkcję agregującą serwer SQL

Używam zapytanie:

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' 

Ta kwerenda dodaje trwania na 2 wybranych utworów muzycznych razem i wyświetla je w tymczasowej kolumnie o nazwie całkowity czas trwania. "Czas trwania" jest typu datowego, więc przekształcam go na liczbę całkowitą iz powrotem.

Moje pytanie: w jaki sposób mogę dostosować zapytanie, aby uwzględnić również pole TrackName i całkowity czas działania? Lub dołącz kolumnę tymczasową, a także kolumnę TrackName.

tak, że wyświetlacz będzie miał nazwy ścieżek i czas trwania łącznej ... wzdłuż linii:

TrackName Duration Total duration 

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

starałem się po prostu zawierać kolumnę nazwy ścieżek do zapytania jak to, ale to nie działa:

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

badawczy "działa łącznie" w SQL –

Odpowiedz

2

spróbować poniżej

i stworzył jedną przykładową tabelę

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 

zapytanie wyjście

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 

wynik

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 dla SQL Server (MySQL) nie

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 

składni znaleźć tutaj running total

MySQL sqlFiddle (nie 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