2009-09-10 59 views
2

我有一個包含間隔表:如何在SQL查詢中聚合兩類值?

CREATE TABLE tbl (
    user_id: INTEGER, 
    start: TIMESTAMP, 
    end: TIMESTAMP, 
    billable: BOOLEAN 
); 

我想創建一個類似如下的觀點:

user_id | billable_time | unbillable_time 

我可以用這樣的查詢得到這兩個一個

SELECT user_id, sum(end - start) AS billable_time WHERE billable = TRUE GROUP BY user_id; 

但是,我需要兩個列,其中不可壓縮的時間是等效的:

SELECT user_id, sum(end - start) AS unbillable_time WHERE billable = FALSE GROUP BY user_id; 

如何將這兩個值合併到一個查詢中?

回答

3
select user_id, sum(case billable when 1 then (end - start) end) as can_bill, 
    sum(case billable when 0 then (end - start) end) as unbillable 
+0

這給了我這個錯誤: 錯誤:在「CASE」處或附近的語法錯誤 LINE 1:...(CASE billable當TRUE然後結束 - 開始END CASE)作爲p ... – 2009-09-10 17:59:08

+0

您只需更改'end case'到'end',它可以工作。謝謝! – 2009-09-10 18:00:45

+0

對不起,我錯誤地使用了MySQL存儲過程語法。 – dnagirl 2009-09-10 18:08:19

0
SELECT user_id, billable, sum(end - start) AS billable_time 
GROUP BY user_id,billable; 
+0

這根本不是我所期待的。我認爲這很明顯,但我想我最好清理這個問題。 – 2009-09-10 17:51:40

+0

它在應用程序層中執行演示的速度更快,更容易。我的其他答案會以速度爲代價給你想要的佈局。 – dnagirl 2009-09-10 18:02:44

+0

我同意。然而,我被告知「把它放在數據庫中」 因此,這或者是一個cron作業來更新具有相同結構的表格。 Faugh。 – 2009-09-10 18:25:09