@xapolll

По какому полю сделать группировку?

Есть таблица продаж с полями: дата продажи, код продавца, сумма. Необходимо посчитать количество продаж для каждого продавца за смену за каждый день. Дневная смена начинается с 10.00 до 22:00, ночная с 22:00 до 10.00
Примерные данные
09.10.2015 11:50; 514; 360
09.10.2015 13:03; 514; 11058
09.10.2015 20:12; 514; 100
09.10.2015 20:30; 514; 270
09.10.2015 21:03; 514; 1200
09.10.2015 21:08; 514; 2400
09.10.2015 22:08; 583; 2290
09.10.2015 22:34; 583; 1190
09.10.2015 23:00; 583; 360
10.10.2015 0:06; 583; 5240
10.10.2015 0:47; 583; 7290
10.10.2015 0:53; 583; 1310

10.10.2015 9:51; 514; 3000
10.10.2015 14:16; 514; 2112
10.10.2015 15:25; 514; 480
10.10.2015 15:51; 514; 260
10.10.2015 20:00; 514; 1000
10.10.2015 20:28; 514; 6700
10.10.2015 22:53; 696; 360
11.10.2015 0:33; 696; 1300
11.10.2015 1:03; 696; 2032
11.10.2015 3:01; 696; 700

11.10.2015 11:32; 514; 1500
11.10.2015 14:15; 514; 6700
11.10.2015 14:45; 514; 3000
11.10.2015 14:49; 514; 1350
11.10.2015 14:59; 514; 1200
11.10.2015 15:12; 514; 260
11.10.2015 16:04; 514; 3200
11.10.2015 16:11; 514; 1140
11.10.2015 16:46; 514; 1220
11.10.2015 20:57; 514; 110
11.10.2015 21:06; 514; 4400

Должно быть на выходе
дневная смена - 09.10.2015; 514; 6
ночная смена - 09.10.2015; 583; 6
дневная смена - 10.10.2015; 514; 6
ночная смена - 10.10.2015; 696; 4
дневная смена - 11.10.2015; 514; 11
  • Вопрос задан
  • 144 просмотра
Пригласить эксперта
Ответы на вопрос 2
@enibeniraba
select user_id, date_format(datetime, "%Y-%m-%d") as day, if (date_format(datetime, "%k") between 10 and 21, 'день', 'ночь') as day_time, count(*) .... group by user_id, day, day_time
Только здесь ночная смена считается не 22-10, а 0-10 + 22-0
Хотя можно и 22-10 наверно правильно посчитать, если пару часов прибавить к datetime: datetime+7200.
Ответ написан
Комментировать
@Noxy
увлекаюсь SQL
Просто на подумать:
Основная проблема в том, что ночная смена начинается одним днем, заканчивается другим.
Поэтому надо проанализировать время и если больше 22 часов - то это ночная смена + рабочий день = следующий, т.е. добавить день. Или наоборот если < 10 утра, то это ночная предыдущего - то -1 день.

анализируем данные, добавляя (или убирая день для ночных) - получаем рабочий день, + признак day или night

группируем уже по полученному рабочему дню, смене, кассиру.

SELECT S.workday, S.smena, S.userid, COUNT(*) 
FROM (
    SELECT t.dtime, t.userid, 
        CONVERT( CASE WHEN HOUR(t.dtime) >= 22 THEN DATE_ADD(t.dtime,INTERVAL 1 DAY) ELSE t.dtime END, DATE) as 'workday', 
        CASE WHEN HOUR(t.dtime) >= 10 AND HOUR(t.dtime) < 22 THEN 'day' ELSE 'night' END as 'smena'
    FROM test AS t
    ) S
GROUP BY workday, smena, userid
ORDER BY S.workday ASC, S.smena DESC, S.userid

пример тут: sqlfiddle.com/#!9/7bd4f/4/0

НО. есть одно большое НО.
Кассиры начинают или заканчивают работы не ровно в 10 утра или 22 вечера.
В вашем же примере
10.10.2015 9:51; 514; 3000
по идее он попадает в ночную смену по интервалу времени, а в реальности работник начал работать раньше.

Либо вводить признак день\ночь и уже не опираться на время либо придумывать велосипед.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы