2015-10-13 48 views
0

我需要創建一個將使用下列數據的SQL查詢:不正確的分組SQL查詢

shift_id, emp_id, date, starttime, endtime 
    1 , 55 , 2015-10-14, 06:00:00, 10:00:00 
    2 , 55 , 2015-10-15, 03:00:00, 13:00:00 
    3 , 52 , 2015-10-15, 07:00:00, 14:00:00 

然後使其顯示在頂部的「日期」與開始的第一天列重新安排一下成爲下週日。我已經開始在下面的嘗試,但如果有工作在同一天2名員工(EMP_ID),它不會顯示分組:

SELECT concat(firstname,' ', surname) AS 'Fname', 
    (CASE WHEN DAYOFWEEK(date) = 1 THEN concat(starttime,'-', endtime) END) `Sunday`, 
    (CASE WHEN DAYOFWEEK(date) = 2 THEN concat(starttime,'-', endtime) END) `Monday`, 
    (CASE WHEN DAYOFWEEK(date) = 3 THEN concat(starttime,'-', endtime) END) `Tuesday`, 
    (CASE WHEN DAYOFWEEK(date) = 4 THEN concat(starttime,'-', endtime) END) `Wednesday`, 
    (CASE WHEN DAYOFWEEK(date) = 5 THEN concat(starttime,'-', endtime) END) `Thursday`, 
    (CASE WHEN DAYOFWEEK(date) = 6 THEN concat(starttime,'-', endtime) END) `Friday`, 
    (CASE WHEN DAYOFWEEK(date) = 7 THEN concat(starttime,'-', endtime) END) `Saturday` 
FROM shifts NATURAL JOIN employees 
GROUP BY Fname, date 

這裏是顯示員工姓名,而不是分組事半功倍的效果?我在哪裏出了錯?:

Result

使用GROUP_CONCAT,不正確的結果顯示如下:

Result2

+0

嘿jarlh,那麼它只顯示第一個結果 – atomapps

回答

2

您正在選擇的列數多於您在GROUP BY中指定的列數。其結果是,MySQL將只需選擇從一個記錄的數據組中表示它:https://dev.mysql.com/doc/refman/5.5/en/group-by-handling.html

MySQL的擴展使用GROUP BY的,這樣的選擇列表可參考在GROUP BY不點名非聚合列條款。這意味着前面的查詢在MySQL中是合法的。您可以使用此功能通過避免不必要的列排序和分組來獲得更好的性能。但是,這非常有用,因爲每個未在GROUP BY中命名的非聚合列中的所有值對於每個組都是相同的。 服務器可以自由選擇每組中的任何值,因此除非它們相同,否則所選值不確定。

嘗試這樣:

SELECT concat(firstname,' ', surname) AS 'Fname', 
    MAX(CASE WHEN DAYOFWEEK(date) = 1 THEN concat(starttime,'-', endtime) END) `Sunday`, 
    MAX(CASE WHEN DAYOFWEEK(date) = 2 THEN concat(starttime,'-', endtime) END) `Monday`, 
    MAX(CASE WHEN DAYOFWEEK(date) = 3 THEN concat(starttime,'-', endtime) END) `Tuesday`, 
    MAX(CASE WHEN DAYOFWEEK(date) = 4 THEN concat(starttime,'-', endtime) END) `Wednesday`, 
    MAX(CASE WHEN DAYOFWEEK(date) = 5 THEN concat(starttime,'-', endtime) END) `Thursday`, 
    MAX(CASE WHEN DAYOFWEEK(date) = 6 THEN concat(starttime,'-', endtime) END) `Friday`, 
    MAX(CASE WHEN DAYOFWEEK(date) = 7 THEN concat(starttime,'-', endtime) END) `Saturday` 
FROM shifts NATURAL JOIN employees 
GROUP BY Fname, date 
+0

謝謝你先生拉馬,你擊中了指甲上的錘子...也刪除了由'日期'組。 – atomapps

0

這是你在尋找什麼? 如果不是,請作一個樣本結果。 第一個選擇只是爲了隱藏一些tmp字段。如果使用程序得到結果,可以將其刪除

SELECT Fname, Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday 
FROM (
    SELECT 
     @timestr:= concat(starttime,'-', endtime) AS a, 
     @datenr:= DAYOFWEEK(DATE) AS b, 
     concat(firstname,' ', surname) AS 'Fname', 
     COALESCE(IF(@datenr = 1, @timestr,'')) AS `Sunday`, 
     COALESCE(IF(@datenr = 2, @timestr,'')) AS `Monday`, 
     COALESCE(IF(@datenr = 3, @timestr,'')) AS `Tuesday`, 
     COALESCE(IF(@datenr = 4, @timestr,'')) AS `Wednesday`, 
     COALESCE(IF(@datenr = 5, @timestr,'')) AS `Thursday`, 
     COALESCE(IF(@datenr = 6, @timestr,'')) AS `Friday`, 
     COALESCE(IF(@datenr = 7, @timestr,'')) AS `Saturday` 
    FROM shifts s 
    LEFT JOIN employees e ON e.emp_id = s.emp_id 
    GROUP BY s.date, s.emp_id 
) AS result; 
+0

嗨貝恩德,這是分組在同一天的日期:http://imgur.com/ SlIUK7b.jpg – atomapps

+0

如果有改變我的答案。請讓我現在,如果它確定 –