Неправильная группировка 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

Вот результат, показывающий имя сотрудника дважды вместо группировки? Где я ошибся?

Результат

Используя GROUP_CONCAT, неверный результат показывает, как показано ниже:

Результат2

0

Решение

Вы выбираете больше столбцов, чем указано в вашем 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
2

Другие решения

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

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector