2013-04-25 6 views
2

Мне нужно группировать имена сотрудников вместе. Я попытался использовать «Order By», но он не работал для пустых ячеек.Группировка тех же полей строк в MySQL?

enter image description here

В таблице в верхней мой текущий стол, и я хочу, чтобы результат, как в таблице внизу. Вот мой текущий запрос выбора.

SELECT 
    DAYNAME(calendar.DATE) AS DAY, 
    DATE_FORMAT(calendar.DATE, '%d %b %Y') AS Date, 
    t2.Department, 
    t2.Name, 
    TIME(t2.time_enter) AS 'Time In', 
    TIME(t2.time_exit) AS 'Time Out' 
FROM 
    calendar 
     LEFT JOIN 
    (SELECT 
     employee_hr_id, 
      time_enter, 
      time_exit, 
      department.NAME As Department, 
      CONCAT(employee.F_NAME, ' ', employee.L_NAME) As Name 
    from 
     entry_log 
    Inner Join employee ON entry_log.EMPLOYEE_HR_ID = employee.HR_ID 
    Inner Join department ON employee.DEPARTMENT_ID = department.ID 
    where 
     CONCAT(employee.F_NAME, ' ', employee.L_NAME) LIKE @NAME) t2 ON date(t2.time_enter) = calendar.date 
where 
    calendar.DATE >= @TIME_ENTER 
     AND calendar.DATE <= @TIME_EXIT 
+0

Как насчет использования INNER JOIN вместо LEFT JOIN в первом соединении? – Devart

+0

Спасибо за ваше предложение, но если я использую INNER JOIN, пустые строки, такие как суббота или воскресенье, не будут отображаться. –

ответ

2

Вместо таблицы КАЛЕНДАРя вы должны использовать следующий подзапрос.

select calendar.DATE,employee.HR_ID,employee.DEPARTMENT_ID 
    from calendar,employee 
    where 
    calendar.DATE >= @TIME_ENTER 
     AND calendar.DATE <= @TIME_EXIT 

В этом случае вы получаете все возможные комбинации DATE и EMPLOYEE. А затем закажите DEPARTMENT_ID, HR_ID, DATE из этой таблицы.

Таким образом, ваш запрос должен выглядеть так:

SELECT 
    DAYNAME(NEW_calendar.DATE) AS DAY, 
    DATE_FORMAT(NEW_calendar.DATE, '%d %b %Y') AS Date, 
    t2.Department, 
    t2.Name, 
    TIME(t2.time_enter) AS 'Time In', 
    TIME(t2.time_exit) AS 'Time Out' 
FROM 
    (
     select calendar.DATE as DATE, 
       employee.HR_ID as HR_ID, 
       employee.DEPARTMENT_ID as DEPARTMENT_ID 
      from calendar,employee 
      where 
       calendar.DATE >= @TIME_ENTER 
       AND calendar.DATE <= @TIME_EXIT 
    ) NEW_calendar 
     LEFT JOIN 
    (SELECT 
     employee_hr_id, 
      time_enter, 
      time_exit, 
      department.NAME As Department, 
      CONCAT(employee.F_NAME, ' ', employee.L_NAME) As Name 
    from 
     entry_log 
    Inner Join employee ON entry_log.EMPLOYEE_HR_ID = employee.HR_ID 
    Inner Join department ON employee.DEPARTMENT_ID = department.ID 
    where 
     CONCAT(employee.F_NAME, ' ', employee.L_NAME) LIKE @NAME) t2 

     ON date(t2.time_enter) = NEW_calendar.date 
      and (t2.EMPLOYEE_HR_ID=NEW_calendar.HR_ID) 
where 
    calendar.DATE >= @TIME_ENTER 
     AND calendar.DATE <= @TIME_EXIT 

order by NEW_calendar.DEPARTMENT_ID,NEW_calendar.HR_ID,NEW_calendar.Date 
1

Там нет ничего в пустых строк, чтобы указать, что работник вы бы ассоциировать с ними. На самом деле они вообще не должны дублироваться. Путь к соединению состоит в объединении трех таблиц (или подзапросов): один для дат, второй для всех (соответствующих) сотрудников, третий с фактическими заданиями. Затем вы можете использовать вторую таблицу всех сотрудников для заказа строк, даже если вы не хотите печатать имена. Полное перекрестное соединение между первыми двумя таблицами дает вам все комбинации между датами и сотрудниками, а затем те, у которых есть записи журнала, могут быть присоединены к этому.

Я создал an example on SQLFiddle. Он использует имена сотрудников вместо идентификаторов для соответствия вещам и принимает t2 как таблицу вместо более сложного подзапроса, но идея должна быть чистой, тем не менее. Вот вопрос из этой скрипты:

SELECT … 
FROM 
    (calendar, 
    (SELECT DISTINCT Name FROM t2) AS employees) 
    LEFT JOIN t2 ON DATE(t2.time_enter) = calendar.date 
       AND t2.Name = employees.Name 
ORDER BY employees.Name, calendar.date 
+0

Благодарим вас за знакомство с SQLFiddle. –

Смежные вопросы