Мне нужно создать запрос 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
Вот результат, показывающий имя сотрудника дважды вместо группировки? Где я ошибся?
Используя GROUP_CONCAT, неверный результат показывает, как показано ниже:
Вы выбираете больше столбцов, чем указано в вашем 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
Это то, что вы ищете?
если нет, пожалуйста, сделайте пример результата.
Первый ВЫБРАТЬ только чтобы скрыть некоторые поля 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;