2012-09-02 46 views
1

我想寫一個查詢,它會顯示工作小時的月持續時間矩陣。我正試圖做到這一點。MySql月度持續時間矩陣

enter image description here

我現在有這個。 enter image description here

正確的輸出應該是 enter image description here

我的SQL是

`SELECT WEEK(start) as weekId, 
       (
        SELECT SUM(TIME_TO_SEC(TIMEDIFF(stop, start))) 
        FROM tbl_time_clock 
        WHERE WEEKDAY(start)=0 
       ) AS Monday, 
       (
        SELECT SUM(TIME_TO_SEC(TIMEDIFF(stop, start))) 
        FROM tbl_time_clock 
        WHERE WEEKDAY(start)=1 
       ) AS Tuesday, 
       (
        SELECT SUM(TIME_TO_SEC(TIMEDIFF(stop, start))) 
        FROM tbl_time_clock 
        WHERE WEEKDAY(start)=2 
       ) AS Wednesday, 
       (
        SELECT SUM(TIME_TO_SEC(TIMEDIFF(stop, start))) 
        FROM tbl_time_clock 
        WHERE WEEKDAY(start)=3 
       ) AS Thursday, 
       (
        SELECT SUM(TIME_TO_SEC(TIMEDIFF(stop, start))) 
        FROM tbl_time_clock 
        WHERE WEEKDAY(start)=4 
       ) AS Friday, 
       (
        SELECT SUM(TIME_TO_SEC(TIMEDIFF(stop, start))) 
        FROM tbl_time_clock 
        WHERE WEEKDAY(start)=5 
       ) AS Saturday, 
       (
        SELECT SUM(TIME_TO_SEC(TIMEDIFF(stop, start))) 
        FROM tbl_time_clock 
        WHERE WEEKDAY(start)=6 
       ) AS Sunday 
      FROM tbl_time_clock 
      WHERE MONTH(start) = {$monthId} AND user_id = {$userId} 
      GROUP BY WEEK(start)` 

表看起來像

 
╔═════════╦═════════════════════╦═════════════════════╗ 
║ user_id ║  start  ║  stop   ║ 
╠═════════╬═════════════════════╬═════════════════════╣ 
║  1 ║ 2012-08-28 08:14:49 ║ 2012-08-28 10:14:49 ║ 
║  1 ║ 2012-08-25 10:00:32 ║ 2012-08-25 16:21:57 ║ 
╚═════════╩═════════════════════╩═════════════════════╝ 

謝謝!

回答

2

您不需要爲此查詢子查詢。

是很常見的只是組由兩個字段,並讓您的編程語言做演示(創建表):

SELECT 
    WEEK(start) as weekId, 
    WEEKDAY(start) as weekDay, 
    TIME_TO_SEC(TIMEDIFF(stop, start)) 
FROM tbl_time_clock 
WHERE MONTH(start) = {$monthId} AND user_id = {$userId} 
GROUP BY WEEK(start), WEEKDAY(start) 

如果你的SQL本身必須真正給出一個矩陣(但是爲什麼呢? ),試試這個:

SELECT 
    WEEK(start) as weekId, 
    SUM(if(WEEKDAY(start)=0,TIME_TO_SEC(TIMEDIFF(stop, start))),0) as Monday, 
    SUM(if(WEEKDAY(start)=1,TIME_TO_SEC(TIMEDIFF(stop, start))),0) as Tuesday, 
    SUM(if(WEEKDAY(start)=2,TIME_TO_SEC(TIMEDIFF(stop, start))),0) as Wednesday, 
    SUM(if(WEEKDAY(start)=3,TIME_TO_SEC(TIMEDIFF(stop, start))),0) as Thursday, 
    SUM(if(WEEKDAY(start)=4,TIME_TO_SEC(TIMEDIFF(stop, start))),0) as Friday, 
    SUM(if(WEEKDAY(start)=5,TIME_TO_SEC(TIMEDIFF(stop, start))),0) as Saturday, 
    SUM(if(WEEKDAY(start)=6,TIME_TO_SEC(TIMEDIFF(stop, start))),0) as Sunday, 
FROM tbl_time_clock 
WHERE MONTH(start) = {$monthId} AND user_id = {$userId} 
GROUP BY WEEK(start) 
+0

Thanks!決定與你的第二個解決方案。剛剛必須將內括號移到外面 - SUM(如果(WEEKDAY(start)= 0,TIME_TO_SEC(TIMEDIFF(stop,start)),0))如星期一 – waterloomatt

+0

@glavić - 已經做到了;我認爲... – waterloomatt

0

看起來你需要限制每個子查詢中的星期。爲此,請向內部表添加別名,以便可以在內部查詢中引用外部查詢中的值。星期一的子查詢應該是這樣的:

(
    SELECT SUM(TIME_TO_SEC(TIMEDIFF(stop, start))) 
    FROM tbl_time_clock AS tbl_inner 
    WHERE WEEKDAY(tbl_inner.start)=0 
    AND WEEK(tbl_inner.start)=tbl_outer.week_start 
) AS Monday 

外部表應受約束的子查詢執行前進行分組,否則會有每週多個結果。所以你的外部FROM子句應該看起來像這樣:

FROM (
    select WEEK(start) AS week_start FROM tbl_time_clock GROUP BY WEEK(start) 
    WHERE MONTH(start) = {$monthId} AND user_id = {$userId} 
) as tbl_outer 

編輯:修正。另外,我同意Konerak可能不需要矩陣,他的SQL解決方案更好。因爲它顯示瞭如何修改給定的SQL以獲得解決方案,所以將它留下。