2013-05-14 69 views
2

請幫忙。這裏有一點點問題,需要一些幫助來解決它。我有一個查詢返回多行,當我嘗試格式化顯示時間,因爲我希望我收到以下消息...SQL如何格式化包含聚合或子查詢的時間

消息130,級別15,狀態1,行3 無法執行聚合函數在包含聚集或子查詢的表達式上。

這裏是我以前當我得到的錯誤...

CAST(SUM(DATEDIFF(second, 0, EntryTime))/3600 AS varchar(12)) + ':' + 
RIGHT('0' + CAST(SUM(DATEDIFF(second, 0, EntryTime))/60 % 60 AS varchar(2)), 2) + ':' + 
RIGHT('0' + CAST(SUM(DATEDIFF(second, 0, EntryTime)) % 60 AS varchar(2)), 2) 

,當我被自己在查詢運行它,我感到我想正確的格式格式...

Project Name  Total Time 
AAA    0:00:19 
BBB    0:00:04 
CCC    6:00:06 
DDD    16:05:52 

但是,我似乎無法弄清楚如何格式化以下查詢以這種方式來顯示時間...

SELECT ProjName AS 'Project Name', 
     CONVERT(VARCHAR(10), SUM(CASE WHEN Phone = 0 AND Research = 0 
            THEN (DATEDIFF(SECOND, 0, EntryTime)) 
           END)) AS [Total Time No PMRE], 
     CONVERT(VARCHAR(10), SUM(CASE WHEN Phone = 1 AND Research = 0 
            THEN (DATEDIFF(SECOND, 0, EntryTime)) 
           END)) AS [Total Time Phone], 
     CONVERT(VARCHAR(10), SUM(CASE WHEN Phone = 0 AND Research = 1 
            THEN (DATEDIFF(SECOND, 0, EntryTime)) 
           END)) AS [Total Time Research], 
     CONVERT(VARCHAR(10), SUM(DATEDIFF(SECOND, 0, EntryTime))) AS 'Total Time' 
FROM WorkTime 
WHERE EntryTime IS NOT NULL 
GROUP BY ProjName 

並得到以下結果......

Project Name Total Time No PMRE Total Time Phone Total Time Research Total Time 
AAA   19     NULL    NULL     19 
BBB   4     NULL    NULL     4 
CCC   10800    7200    3606     21606 
DDD   57952    NULL    NULL     57952 

所有這一切都是正確的,但我需要搞清楚如何格式化顯示爲小時的時間幫助:分鐘:秒......其實,我不知道需要秒,只需幾小時和幾分鐘,但任何建議,幫助,指向正確的方向將是美好的。謝謝!

+0

只要時間是低於24小時,然後再使用CA:聲明@Seconds INT = 123 選擇轉換(VARCHAR(20),使用DateAdd(β,@秒,0),108 ) – bummi 2013-05-14 16:21:27

+0

感謝您的建議馬克!不幸的是,會有超過24小時的時間。 – 2013-05-14 16:49:56

+0

您在錯誤的帖子投了票;-),您將不得不在@MarkBannister – bummi 2013-05-14 17:06:09

回答

2

嘗試:

with cte as 
(SELECT ProjName , 
     SUM(CASE WHEN Phone = 0 AND Research = 0 THEN DATEDIFF(SECOND, 0, EntryTime) END) AS [Total Time No PMRE], 
     SUM(CASE WHEN Phone = 1 AND Research = 0 THEN DATEDIFF(SECOND, 0, EntryTime) END) AS [Total Time Phone], 
     SUM(CASE WHEN Phone = 0 AND Research = 1 THEN DATEDIFF(SECOND, 0, EntryTime) END) AS [Total Time Research], 
     SUM(DATEDIFF(SECOND, 0, EntryTime)) AS [Total Time] 
FROM WorkTime 
WHERE EntryTime IS NOT NULL 
GROUP BY ProjName) 
SELECT ProjName AS [Project Name], 
     CAST([Total Time No PMRE]/3600 AS varchar(12)) + ':' 
     + RIGHT('0' + CAST([Total Time No PMRE]/60 % 60 AS varchar(2)), 2) + ':' 
     + RIGHT('0' + CAST([Total Time No PMRE] % 60 AS varchar(2)), 2) AS [Total Time No PMRE], 
     CAST([Total Time Phone]/3600 AS varchar(12)) + ':' 
     + RIGHT('0' + CAST([Total Time Phone]/60 % 60 AS varchar(2)), 2) + ':' 
     + RIGHT('0' + CAST([Total Time Phone] % 60 AS varchar(2)), 2) AS [Total Time Phone], 
     CAST([Total Time Research]/3600 AS varchar(12)) + ':' 
     + RIGHT('0' + CAST([Total Time Research]/60 % 60 AS varchar(2)), 2) + ':' 
     + RIGHT('0' + CAST([Total Time Research] % 60 AS varchar(2)), 2) AS [Total Time Research], 
     CAST([Total Time]/3600 AS varchar(12)) + ':' 
     + RIGHT('0' + CAST([Total Time]/60 % 60 AS varchar(2)), 2) + ':' 
     + RIGHT('0' + CAST([Total Time] % 60 AS varchar(2)), 2) AS [Total Time] 
FROM cte 
+0

@JeremyDodt:很高興我能幫上忙。 :) – 2013-05-14 17:16:50

相關問題