powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Итоги SELECT'a по строке
10 сообщений из 10, страница 1 из 1
Итоги SELECT'a по строке
    #39791731
Валерий666
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день. Есть запрос, который выводит результатом срез по справочникам, сотрудников, регистраций сотрудников, заметок к выбранной дате, и их штатное расписание.
В упрощенном варианте, получается список по подразделению, и отработанному времени.

Пример за 5 дней: с 1-5 марта 2019:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
SELECT users.ufio,users.sh_id,users.userid, 
  TIME_FORMAT(TIMEDIFF(MAX(CASE WHEN  DATE(registration.dateout) = '2019-02-01' THEN TIME_FORMAT(registration.dateout,'%H:%i') END),MIN(CASE WHEN  DATE(registration.datein) = '2019-02-01' THEN TIME_FORMAT(registration.datein ,'%H:%i') END)),'%H:%i') AS TimeDiff1,
  TIME_FORMAT(TIMEDIFF(MAX(CASE WHEN  DATE(registration.dateout) = '2019-02-02' THEN TIME_FORMAT(registration.dateout,'%H:%i') END),MIN(CASE WHEN  DATE(registration.datein) = '2019-02-02' THEN TIME_FORMAT(registration.datein ,'%H:%i') END)),'%H:%i') AS TimeDiff2,
  TIME_FORMAT(TIMEDIFF(MAX(CASE WHEN  DATE(registration.dateout) = '2019-02-03' THEN TIME_FORMAT(registration.dateout,'%H:%i') END),MIN(CASE WHEN  DATE(registration.datein) = '2019-02-03' THEN TIME_FORMAT(registration.datein ,'%H:%i') END)),'%H:%i') AS TimeDiff3,
  TIME_FORMAT(TIMEDIFF(MAX(CASE WHEN  DATE(registration.dateout) = '2019-02-04' THEN TIME_FORMAT(registration.dateout,'%H:%i') END),MIN(CASE WHEN  DATE(registration.datein) = '2019-02-04' THEN TIME_FORMAT(registration.datein ,'%H:%i') END)),'%H:%i') AS TimeDiff4,
  TIME_FORMAT(TIMEDIFF(MAX(CASE WHEN  DATE(registration.dateout) = '2019-02-05' THEN TIME_FORMAT(registration.dateout,'%H:%i') END),MIN(CASE WHEN  DATE(registration.datein) = '2019-02-05' THEN TIME_FORMAT(registration.datein ,'%H:%i') END)),'%H:%i') AS TimeDiff5,
  FROM registration  
  RIGHT JOIN users ON users.rfid_id= registration.rfid_id  
  LEFT JOIN notes ON users.userid=notes.userid  
  WHERE users.wpid=(SELECT pid FROM workplaces WHERE name='Контора') 
  GROUP BY users.userid



Результат запроса:
ufio sh_id userid TimeDiff1 TimeDiff2 TimeDiff3 TimeDiff4 TimeDiff5Навоева Д.Н. 0 1755 null null null 9:11 nullНасивалиева С.Ю. 2 1756 null null null null nullНикиткова Л.И. 0 1758 null null null null 9:55Новиков В.В. 0 1763 null 10:44 null null nullНовикова С.В. 0 1767 null null null null nullОлиферович А.Н. 0 1768 null null null null nullПавлова Н.Л. 0 1776 null null null 11:38 nullПинчук И.М. 0 1778 9:56 null null null nullПищало О.Н. 0 1789 null null null null 9:45Плашкова И.И. 0 1793 null null null 10:40 nullПоболовец И.В. 0 1796 null 11:07 null 9:20 10:00Полуян Т.П. 0 1797 null 11:03 null null nullПопова А.В. 0 1799 null null null null nullПопова А.В. 0 1802 null null null null nullПопова Ю.В. 0 1806 null null null null null


Можно ли вывести колонкой, суммарный итог отработанного времени по каждому сотруднику (Сумма TimeDiff1-TimeDiff5) ?
...
Рейтинг: 0 / 0
Итоги SELECT'a по строке
    #39791858
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Конечно, можно. Выводите. Выражения есть. Только для их сложения надо использовать не TIMEDIFF, а TIMESTAMPDIFF.
...
Рейтинг: 0 / 0
Итоги SELECT'a по строке
    #39791866
Валерий666
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AkinaКонечно, можно. Выводите. Выражения есть. Только для их сложения надо использовать не TIMEDIFF, а TIMESTAMPDIFF.
Может подскажите как?

AkinaТолько для их сложения надо использовать не TIMEDIFF, а TIMESTAMPDIFF.
Пробовал и так, разницы в расчете нет.
...
Рейтинг: 0 / 0
Итоги SELECT'a по строке
    #39791875
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Валерий666Пробовал и так, разницы в расчете нет.Есть. Они дают разные типы данных. То, что даёт TIMESTAMPDIFF, можно корректно складывать.
...
Рейтинг: 0 / 0
Итоги SELECT'a по строке
    #39792009
paver
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Валерий666, может вам вместо registration использовать что-то типа
Код: sql
1.
2.
3.
4.
5.
6.
7.
SELECT rfid_id,
  COALESCE(DATE(datein), DATE(dateout)) dt,
  TIMEDIFF(MAX(dateout), MIN(datein)) rt
FROM registration
WHERE datein BETWEEN '2019-02-01' AND '2019-02-06'
  OR  dateout) BETWEEN '2019-02-01' AND '2019-02-06'
GROUP BY rfid_id, dt


и с ним работать?
...
Рейтинг: 0 / 0
Итоги SELECT'a по строке
    #39792113
Валерий666
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
paverВалерий666, может вам вместо registration использовать что-то типа
Код: sql
1.
2.
3.
4.
5.
6.
7.
SELECT rfid_id,
  COALESCE(DATE(datein), DATE(dateout)) dt,
  TIMEDIFF(MAX(dateout), MIN(datein)) rt
FROM registration
WHERE datein BETWEEN '2019-02-01' AND '2019-02-06'
  OR  dateout) BETWEEN '2019-02-01' AND '2019-02-06'
GROUP BY rfid_id, dt


и с ним работать?
Не совсем то, что надо. Мне надо чтобы результирующий набор данных был такой как в 1-ом посте + еще одна колонка в которой сумма отработанного времени(с колонки 1 по 5)
...
Рейтинг: 0 / 0
Итоги SELECT'a по строке
    #39792153
paver
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Валерий666Не совсем то, что надо.
А это и не замена исходного запроса. Я предлагаю вместо FROM registration использовать FROM (мой_селект), чтобы избавиться от диких кейсов.
...
Рейтинг: 0 / 0
Итоги SELECT'a по строке
    #39792193
Валерий666
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
paverВалерий666Не совсем то, что надо.
А это и не замена исходного запроса. Я предлагаю вместо FROM registration использовать FROM (мой_селект), чтобы избавиться от диких кейсов.
Я с MySQL "на ВЫ", так что не совсем представляю конечную конструкцию и ее смыл...

У меня есть несколько таблиц.
Таблица А: Пользователи (справочник)
Таблица Б: Режимы работы (справочник)
Таблица В: Заметки
Таблица Г: Входы - Выходы пользователей.

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

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
SELECT users.ufio, 
users.sh_id, 
users.userid, 
  MIN(CASE WHEN  DATE(registration.datein) = '2019-02-01' THEN TIME_FORMAT(registration.datein ,'%H:%i') END) AS  din1, 
  MAX(CASE WHEN (notes.daten='2019-02-01')  AND (users.userid=notes.userid)  THEN notes.note END) AS note1, 
  MAX(CASE WHEN  DATE(registration.dateout) = '2019-02-01' THEN TIME_FORMAT(registration.dateout,'%H:%i') END) AS dout1, 
  MIN(CASE WHEN  DATE(registration.datein) = '2019-02-02' THEN TIME_FORMAT(registration.datein ,'%H:%i') END) AS  din2, 
  MAX(CASE WHEN (notes.daten='2019-02-02')  AND (users.userid=notes.userid)  THEN notes.note END) AS note2, 
  MAX(CASE WHEN  DATE(registration.dateout) = '2019-02-02' THEN TIME_FORMAT(registration.dateout,'%H:%i') END) AS dout2, 
  MIN(CASE WHEN  DATE(registration.datein) = '2019-02-03' THEN TIME_FORMAT(registration.datein ,'%H:%i') END) AS  din3, 
  MAX(CASE WHEN (notes.daten='2019-02-03')  AND (users.userid=notes.userid)  THEN notes.note END) AS note3, 
  MAX(CASE WHEN  DATE(registration.dateout) = '2019-02-03' THEN TIME_FORMAT(registration.dateout,'%H:%i') END) AS dout3, 
  MIN(CASE WHEN  DATE(registration.datein) = '2019-02-04' THEN TIME_FORMAT(registration.datein ,'%H:%i') END) AS  din4, 
  MAX(CASE WHEN (notes.daten='2019-02-04')  AND (users.userid=notes.userid)  THEN notes.note END) AS note4, 
  MAX(CASE WHEN  DATE(registration.dateout) = '2019-02-04' THEN TIME_FORMAT(registration.dateout,'%H:%i') END) AS dout4, 
  MIN(CASE WHEN  DATE(registration.datein) = '2019-02-05' THEN TIME_FORMAT(registration.datein ,'%H:%i') END) AS  din5, 
  MAX(CASE WHEN (notes.daten='2019-02-05')  AND (users.userid=notes.userid)  THEN notes.note END) AS note5, 
  MAX(CASE WHEN  DATE(registration.dateout) = '2019-02-05' THEN TIME_FORMAT(registration.dateout, '%H:%i') END) AS dout5, 
  MIN(CASE WHEN  DATE(registration.datein) = '2019-02-06' THEN TIME_FORMAT(registration.datein ,'%H:%i') END) AS  din6, 
  MAX(CASE WHEN (notes.daten='2019-02-06')  AND (users.userid=notes.userid)  THEN notes.note END) AS note6, 
  MAX(CASE WHEN  DATE(registration.dateout) = '2019-02-06' THEN TIME_FORMAT(registration.dateout,'%H:%i') END) AS dout6, 
  MIN(CASE WHEN  DATE(registration.datein) = '2019-02-07' THEN TIME_FORMAT(registration.datein ,'%H:%i') END) AS  din7, 
  MAX(CASE WHEN (notes.daten='2019-02-07')  AND (users.userid=notes.userid)  THEN notes.note END) AS note7, 
  MAX(CASE WHEN  DATE(registration.dateout) = '2019-02-07' THEN TIME_FORMAT(registration.dateout,'%H:%i') END) AS dout7, 
  MIN(CASE WHEN  DATE(registration.datein) = '2019-02-08' THEN TIME_FORMAT(registration.datein , '%H:%i') END) AS  din8, 
  MAX(CASE WHEN (notes.daten='2019-02-08')  AND (users.userid=notes.userid)  THEN notes.note END) AS note8, 
  MAX(CASE WHEN  DATE(registration.dateout) = '2019-02-08' THEN TIME_FORMAT(registration.dateout,'%H:%i') END) AS dout8, 
  MIN(CASE WHEN  DATE(registration.datein) = '2019-02-09' THEN TIME_FORMAT(registration.datein , '%H:%i') END) AS  din9, 
  MAX(CASE WHEN (notes.daten='2019-02-09')  AND (users.userid=notes.userid)  THEN notes.note END) AS note9, 
  MAX(CASE WHEN  DATE(registration.dateout) = '2019-02-09' THEN TIME_FORMAT(registration.dateout,'%H:%i') END) AS dout9, 
  MIN(CASE WHEN  DATE(registration.datein) = '2019-02-10' THEN TIME_FORMAT(registration.datein , '%H:%i') END) AS  din10, 
  MAX(CASE WHEN (notes.daten='2019-02-10')  AND (users.userid=notes.userid)  THEN notes.note END) AS note10, 
  MAX(CASE WHEN  DATE(registration.dateout) = '2019-02-10' THEN TIME_FORMAT(registration.dateout,'%H:%i') END) AS dout10, 
  MIN(CASE WHEN  DATE(registration.datein) = '2019-02-11' THEN TIME_FORMAT(registration.datein , '%H:%i') END) AS  din11, 
  MAX(CASE WHEN (notes.daten='2019-02-11')  AND (users.userid=notes.userid)  THEN notes.note END) AS note11, 
  MAX(CASE WHEN  DATE(registration.dateout) = '2019-02-11' THEN TIME_FORMAT(registration.dateout,'%H:%i') END) AS dout11, 
  MIN(CASE WHEN  DATE(registration.datein) = '2019-02-12' THEN TIME_FORMAT(registration.datein , '%H:%i') END) AS  din12, 
  MAX(CASE WHEN (notes.daten='2019-02-12')  AND (users.userid=notes.userid)  THEN notes.note END) AS note12, 
  MAX(CASE WHEN  DATE(registration.dateout) = '2019-02-12' THEN TIME_FORMAT(registration.dateout,'%H:%i') END) AS dout12, 
  MIN(CASE WHEN  DATE(registration.datein) = '2019-02-13' THEN TIME_FORMAT(registration.datein , '%H:%i') END) AS  din13, 
  MAX(CASE WHEN (notes.daten='2019-02-13')  AND (users.userid=notes.userid)  THEN notes.note END) AS note13, 
  MAX(CASE WHEN  DATE(registration.dateout) = '2019-02-13' THEN TIME_FORMAT(registration.dateout,'%H:%i') END) AS dout13, 
  MIN(CASE WHEN  DATE(registration.datein) = '2019-02-14' THEN TIME_FORMAT(registration.datein , '%H:%i') END) AS  din14, 
  MAX(CASE WHEN (notes.daten='2019-02-14')  AND (users.userid=notes.userid)  THEN notes.note END) AS note14, 
  MAX(CASE WHEN  DATE(registration.dateout) = '2019-02-14' THEN TIME_FORMAT(registration.dateout,'%H:%i') END) AS dout14, 
  MIN(CASE WHEN  DATE(registration.datein) = '2019-02-15' THEN TIME_FORMAT(registration.datein , '%H:%i') END) AS  din15, 
  MAX(CASE WHEN (notes.daten='2019-02-15')  AND (users.userid=notes.userid)  THEN notes.note END) AS note15, 
  MAX(CASE WHEN  DATE(registration.dateout) = '2019-02-15' THEN TIME_FORMAT(registration.dateout,'%H:%i') END) AS dout15, 
  MIN(CASE WHEN  DATE(registration.datein) = '2019-02-16' THEN TIME_FORMAT(registration.datein , '%H:%i') END) AS  din16, 
  MAX(CASE WHEN (notes.daten='2019-02-16')  AND (users.userid=notes.userid)  THEN notes.note END) AS note16, 
  MAX(CASE WHEN  DATE(registration.dateout) = '2019-02-16' THEN TIME_FORMAT(registration.dateout, '%H:%i') END) AS dout16, 
  MIN(CASE WHEN  DATE(registration.datein) = '2019-02-17' THEN TIME_FORMAT(registration.datein , '%H:%i') END) AS  din17, 
  MAX(CASE WHEN (notes.daten='2019-02-17')  AND (users.userid=notes.userid)  THEN notes.note END) AS note17, 
  MAX(CASE WHEN  DATE(registration.dateout) = '2019-02-17' THEN TIME_FORMAT(registration.dateout,'%H:%i') END) AS dout17, 
  MIN(CASE WHEN  DATE(registration.datein) = '2019-02-18' THEN TIME_FORMAT(registration.datein , '%H:%i') END) AS  din18, 
  MAX(CASE WHEN (notes.daten='2019-02-18')  AND (users.userid=notes.userid)  THEN notes.note END) AS note18, 
  MAX(CASE WHEN  DATE(registration.dateout) = '2019-02-18' THEN TIME_FORMAT(registration.dateout,'%H:%i') END) AS dout18, 
  MIN(CASE WHEN  DATE(registration.datein) = '2019-02-19' THEN TIME_FORMAT(registration.datein , '%H:%i') END) AS  din19, 
  MAX(CASE WHEN (notes.daten='2019-02-19')  AND (users.userid=notes.userid)  THEN notes.note END) AS note19, 
  MAX(CASE WHEN  DATE(registration.dateout) = '2019-02-19' THEN TIME_FORMAT(registration.dateout, '%H:%i') END) AS dout19, 
  MIN(CASE WHEN  DATE(registration.datein) = '2019-02-20' THEN TIME_FORMAT(registration.datein , '%H:%i') END) AS  din20, 
  MAX(CASE WHEN (notes.daten='2019-02-20')  AND (users.userid=notes.userid)  THEN notes.note END) AS note20, 
  MAX(CASE WHEN  DATE(registration.dateout) = '2019-02-20' THEN TIME_FORMAT(registration.dateout,'%H:%i') END) AS dout20, 
  MIN(CASE WHEN  DATE(registration.datein) = '2019-02-21' THEN TIME_FORMAT(registration.datein , '%H:%i') END) AS  din21, 
  MAX(CASE WHEN (notes.daten='2019-02-21')  AND (users.userid=notes.userid)  THEN notes.note END) AS note21, 
  MAX(CASE WHEN  DATE(registration.dateout) = '2019-02-21' THEN TIME_FORMAT(registration.dateout,'%H:%i') END) AS dout21, 
  MIN(CASE WHEN  DATE(registration.datein) = '2019-02-22' THEN TIME_FORMAT(registration.datein , '%H:%i') END) AS  din22, 
  MAX(CASE WHEN (notes.daten='2019-02-22')  AND (users.userid=notes.userid)  THEN notes.note END) AS note22, 
  MAX(CASE WHEN  DATE(registration.dateout) = '2019-02-22' THEN TIME_FORMAT(registration.dateout,'%H:%i') END) AS dout22, 
  MIN(CASE WHEN  DATE(registration.datein) = '2019-02-23' THEN TIME_FORMAT(registration.datein ,'%H:%i') END) AS  din23, 
  MAX(CASE WHEN (notes.daten='2019-02-23')  AND (users.userid=notes.userid)  THEN notes.note END) AS note23, 
  MAX(CASE WHEN  DATE(registration.dateout) = '2019-02-23' THEN TIME_FORMAT(registration.dateout, '%H:%i') END) AS dout23, 
  MIN(CASE WHEN  DATE(registration.datein) = '2019-02-24' THEN TIME_FORMAT(registration.datein ,   '%H:%i') END) AS  din24, 
  MAX(CASE WHEN (notes.daten='2019-02-24')  AND (users.userid=notes.userid)  THEN notes.note END) AS note24, 
  MAX(CASE WHEN  DATE(registration.dateout) = '2019-02-24' THEN TIME_FORMAT(registration.dateout, '%H:%i') END) AS dout24, 
  MIN(CASE WHEN  DATE(registration.datein) = '2019-02-25' THEN TIME_FORMAT(registration.datein ,   '%H:%i') END) AS  din25, 
  MAX(CASE WHEN (notes.daten='2019-02-25')  AND (users.userid=notes.userid)  THEN notes.note END) AS note25, 
  MAX(CASE WHEN  DATE(registration.dateout) = '2019-02-25' THEN TIME_FORMAT(registration.dateout,'%H:%i') END) AS dout25, 
  MIN(CASE WHEN  DATE(registration.datein) = '2019-02-26' THEN TIME_FORMAT(registration.datein , '%H:%i') END) AS  din26, 
  MAX(CASE WHEN (notes.daten='2019-02-26')  AND (users.userid=notes.userid)  THEN notes.note END) AS note26, 
  MAX(CASE WHEN  DATE(registration.dateout) = '2019-02-26' THEN TIME_FORMAT(registration.dateout, '%H:%i') END) AS dout26, 
  MIN(CASE WHEN  DATE(registration.datein) = '2019-02-27' THEN TIME_FORMAT(registration.datein , '%H:%i') END) AS  din27, 
  MAX(CASE WHEN (notes.daten='2019-02-27')  AND (users.userid=notes.userid)  THEN notes.note END) AS note27, 
  MAX(CASE WHEN  DATE(registration.dateout) = '2019-02-27' THEN TIME_FORMAT(registration.dateout, '%H:%i') END) AS dout27, 
  MIN(CASE WHEN  DATE(registration.datein) = '2019-02-28' THEN TIME_FORMAT(registration.datein , '%H:%i') END) AS  din28, 
  MAX(CASE WHEN (notes.daten='2019-02-28')  AND (users.userid=notes.userid)  THEN notes.note END) AS note28, 
  MAX(CASE WHEN  DATE(registration.dateout) = '2019-02-28' THEN TIME_FORMAT(registration.dateout, '%H:%i') END) AS dout28 
  FROM registration  
  RIGHT JOIN users ON users.rfid_id= registration.rfid_id  
  LEFT JOIN notes ON users.userid=notes.userid 
  WHERE users.wpid=(SELECT pid FROM workplaces WHERE name='Участок розничной торговли')  
  GROUP BY users.ufio




Вероятнее всего это дикий изврат, но как сделать по-другому, что был такой же результат, я не знаю.
По аналогии делаю такой же запрос на отработку времени.


Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
SELECT users.ufio,
  users.sh_id,
  users.userid, 
  TIME_FORMAT(SEC_TO_TIME(TIMESTAMPDIFF(SECOND,MIN(CASE WHEN  DATE(registration.datein) = '2019-03-01' THEN registration.datein END),MAX(CASE WHEN  DATE(registration.dateout) = '2019-03-01' THEN registration.dateout END))),'%H:%i') AS td1,
  TIME_FORMAT(SEC_TO_TIME(TIMESTAMPDIFF(SECOND,MIN(CASE WHEN  DATE(registration.datein) = '2019-03-02' THEN registration.datein END),MAX(CASE WHEN  DATE(registration.dateout) = '2019-03-02' THEN registration.dateout END))),'%H:%i') AS td2, 
  TIME_FORMAT(SEC_TO_TIME(TIMESTAMPDIFF(SECOND,MIN(CASE WHEN  DATE(registration.datein) = '2019-03-03' THEN registration.datein END),MAX(CASE WHEN  DATE(registration.dateout) = '2019-03-03' THEN registration.dateout END))),'%H:%i') AS td3, 
  TIME_FORMAT(SEC_TO_TIME(TIMESTAMPDIFF(SECOND,MIN(CASE WHEN  DATE(registration.datein) = '2019-03-04' THEN registration.datein END),MAX(CASE WHEN  DATE(registration.dateout) = '2019-03-04' THEN registration.dateout END))),'%H:%i') AS td4, 
  TIME_FORMAT(SEC_TO_TIME(TIMESTAMPDIFF(SECOND,MIN(CASE WHEN  DATE(registration.datein) = '2019-03-05' THEN registration.datein END),MAX(CASE WHEN  DATE(registration.dateout) = '2019-03-05' THEN registration.dateout END))),'%H:%i') AS td5, 
  TIME_FORMAT(SEC_TO_TIME(TIMESTAMPDIFF(SECOND,MIN(CASE WHEN  DATE(registration.datein) = '2019-03-06' THEN registration.datein END),MAX(CASE WHEN  DATE(registration.dateout) = '2019-03-06' THEN registration.dateout END))),'%H:%i') AS td6, 
  TIME_FORMAT(SEC_TO_TIME(TIMESTAMPDIFF(SECOND,MIN(CASE WHEN  DATE(registration.datein) = '2019-03-07' THEN registration.datein END),MAX(CASE WHEN  DATE(registration.dateout) = '2019-03-07' THEN registration.dateout END))),'%H:%i') AS td7, 
  TIME_FORMAT(SEC_TO_TIME(TIMESTAMPDIFF(SECOND,MIN(CASE WHEN  DATE(registration.datein) = '2019-03-08' THEN registration.datein END),MAX(CASE WHEN  DATE(registration.dateout) = '2019-03-08' THEN registration.dateout END))),'%H:%i') AS td8, 
  TIME_FORMAT(SEC_TO_TIME(TIMESTAMPDIFF(SECOND,MIN(CASE WHEN  DATE(registration.datein) = '2019-03-09' THEN registration.datein END),MAX(CASE WHEN  DATE(registration.dateout) = '2019-03-09' THEN registration.dateout END))),'%H:%i') AS td9, 
  TIME_FORMAT(SEC_TO_TIME(TIMESTAMPDIFF(SECOND,MIN(CASE WHEN  DATE(registration.datein) = '2019-03-10' THEN registration.datein END),MAX(CASE WHEN  DATE(registration.dateout) = '2019-03-10' THEN registration.dateout END))),'%H:%i') AS td10, 
  TIME_FORMAT(SEC_TO_TIME(TIMESTAMPDIFF(SECOND,MIN(CASE WHEN  DATE(registration.datein) = '2019-03-11' THEN registration.datein END),MAX(CASE WHEN  DATE(registration.dateout) = '2019-03-11' THEN registration.dateout END))),'%H:%i') AS td11, 
  TIME_FORMAT(SEC_TO_TIME(TIMESTAMPDIFF(SECOND,MIN(CASE WHEN  DATE(registration.datein) = '2019-03-12' THEN registration.datein END),MAX(CASE WHEN  DATE(registration.dateout) = '2019-03-12' THEN registration.dateout END))),'%H:%i') AS td12, 
  TIME_FORMAT(SEC_TO_TIME(TIMESTAMPDIFF(SECOND,MIN(CASE WHEN  DATE(registration.datein) = '2019-03-13' THEN registration.datein END),MAX(CASE WHEN  DATE(registration.dateout) = '2019-03-13' THEN registration.dateout END))),'%H:%i') AS td13, 
  TIME_FORMAT(SEC_TO_TIME(TIMESTAMPDIFF(SECOND,MIN(CASE WHEN  DATE(registration.datein) = '2019-03-14' THEN registration.datein END),MAX(CASE WHEN  DATE(registration.dateout) = '2019-03-14' THEN registration.dateout END))),'%H:%i') AS td14, 
  TIME_FORMAT(SEC_TO_TIME(TIMESTAMPDIFF(SECOND,MIN(CASE WHEN  DATE(registration.datein) = '2019-03-15' THEN registration.datein END),MAX(CASE WHEN  DATE(registration.dateout) = '2019-03-15' THEN registration.dateout END))),'%H:%i') AS td15, 
  TIME_FORMAT(SEC_TO_TIME(TIMESTAMPDIFF(SECOND,MIN(CASE WHEN  DATE(registration.datein) = '2019-03-16' THEN registration.datein END),MAX(CASE WHEN  DATE(registration.dateout) = '2019-03-16' THEN registration.dateout END))),'%H:%i') AS td16, 
  TIME_FORMAT(SEC_TO_TIME(TIMESTAMPDIFF(SECOND,MIN(CASE WHEN  DATE(registration.datein) = '2019-03-17' THEN registration.datein END),MAX(CASE WHEN  DATE(registration.dateout) = '2019-03-17' THEN registration.dateout END))),'%H:%i') AS td17, 
  TIME_FORMAT(SEC_TO_TIME(TIMESTAMPDIFF(SECOND,MIN(CASE WHEN  DATE(registration.datein) = '2019-03-18' THEN registration.datein END),MAX(CASE WHEN  DATE(registration.dateout) = '2019-03-18' THEN registration.dateout END))),'%H:%i') AS td18, 
  TIME_FORMAT(SEC_TO_TIME(TIMESTAMPDIFF(SECOND,MIN(CASE WHEN  DATE(registration.datein) = '2019-03-19' THEN registration.datein END),MAX(CASE WHEN  DATE(registration.dateout) = '2019-03-19' THEN registration.dateout END))),'%H:%i') AS td19, 
  TIME_FORMAT(SEC_TO_TIME(TIMESTAMPDIFF(SECOND,MIN(CASE WHEN  DATE(registration.datein) = '2019-03-20' THEN registration.datein END),MAX(CASE WHEN  DATE(registration.dateout) = '2019-03-20' THEN registration.dateout END))),'%H:%i') AS td20, 
  TIME_FORMAT(SEC_TO_TIME(TIMESTAMPDIFF(SECOND,MIN(CASE WHEN  DATE(registration.datein) = '2019-03-21' THEN registration.datein END),MAX(CASE WHEN  DATE(registration.dateout) = '2019-03-21' THEN registration.dateout END))),'%H:%i') AS td21, 
  TIME_FORMAT(SEC_TO_TIME(TIMESTAMPDIFF(SECOND,MIN(CASE WHEN  DATE(registration.datein) = '2019-03-22' THEN registration.datein END),MAX(CASE WHEN  DATE(registration.dateout) = '2019-03-22' THEN registration.dateout END))),'%H:%i') AS td22, 
  TIME_FORMAT(SEC_TO_TIME(TIMESTAMPDIFF(SECOND,MIN(CASE WHEN  DATE(registration.datein) = '2019-03-23' THEN registration.datein END),MAX(CASE WHEN  DATE(registration.dateout) = '2019-03-23' THEN registration.dateout END))),'%H:%i') AS td23, 
  TIME_FORMAT(SEC_TO_TIME(TIMESTAMPDIFF(SECOND,MIN(CASE WHEN  DATE(registration.datein) = '2019-03-24' THEN registration.datein END),MAX(CASE WHEN  DATE(registration.dateout) = '2019-03-24' THEN registration.dateout END))),'%H:%i') AS td24, 
  TIME_FORMAT(SEC_TO_TIME(TIMESTAMPDIFF(SECOND,MIN(CASE WHEN  DATE(registration.datein) = '2019-03-25' THEN registration.datein END),MAX(CASE WHEN  DATE(registration.dateout) = '2019-03-25' THEN registration.dateout END))),'%H:%i') AS td25, 
  TIME_FORMAT(SEC_TO_TIME(TIMESTAMPDIFF(SECOND,MIN(CASE WHEN  DATE(registration.datein) = '2019-03-26' THEN registration.datein END),MAX(CASE WHEN  DATE(registration.dateout) = '2019-03-26' THEN registration.dateout END))),'%H:%i') AS td26, 
  TIME_FORMAT(SEC_TO_TIME(TIMESTAMPDIFF(SECOND,MIN(CASE WHEN  DATE(registration.datein) = '2019-03-27' THEN registration.datein END),MAX(CASE WHEN  DATE(registration.dateout) = '2019-03-27' THEN registration.dateout END))),'%H:%i') AS td27, 
  TIME_FORMAT(SEC_TO_TIME(TIMESTAMPDIFF(SECOND,MIN(CASE WHEN  DATE(registration.datein) = '2019-03-28' THEN registration.datein END),MAX(CASE WHEN  DATE(registration.dateout) = '2019-03-28' THEN registration.dateout END))),'%H:%i') AS td28, 
  TIME_FORMAT(SEC_TO_TIME(TIMESTAMPDIFF(SECOND,MIN(CASE WHEN  DATE(registration.datein) = '2019-03-29' THEN registration.datein END),MAX(CASE WHEN  DATE(registration.dateout) = '2019-03-29' THEN registration.dateout END))),'%H:%i') AS td29, 
  TIME_FORMAT(SEC_TO_TIME(TIMESTAMPDIFF(SECOND,MIN(CASE WHEN  DATE(registration.datein) = '2019-03-30' THEN registration.datein END),MAX(CASE WHEN  DATE(registration.dateout) = '2019-03-30' THEN registration.dateout END))),'%H:%i') AS td30, 
  TIME_FORMAT(SEC_TO_TIME(TIMESTAMPDIFF(SECOND,MIN(CASE WHEN  DATE(registration.datein) = '2019-03-31' THEN registration.datein END),MAX(CASE WHEN  DATE(registration.dateout) = '2019-03-31' THEN registration.dateout END))),'%H:%i') AS td31 
  FROM registration  
  RIGHT JOIN users ON users.rfid_id= registration.rfid_id  
  LEFT JOIN notes ON users.userid=notes.userid   
  WHERE users.wpid=(SELECT pid FROM workplaces WHERE name='Контора')  
  GROUP BY users.ufio




Результат меня в принципе тоже устраивает, но нужна еще, как я писал выше, итоговая колонка с суммой отработанного времени.
...
Рейтинг: 0 / 0
Итоги SELECT'a по строке
    #39792672
paver
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Валерий666Я с MySQL "на ВЫ"
Я сам чайник.
Попробуйте:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
SELECT r.rfid_id,
  MAX(r.dt1) dt1,
  MAX(r.dt2) dt2,
  MAX(r.dt3) dt3,
  MAX(r.dt4) dt4,
  MAX(r.dt5) dt5,
  SEC_TO_TIME(SUM(r.rt)) itog
FROM (
  SELECT rfid_id,
    DATE(COALESCE(datein, dateout)) dt,
    IF(DATE(COALESCE(datein, dateout)) ="2019-01-01", TIMEDIFF(MAX(dateout), MIN(datein)), NULL) dt1,
    IF(DATE(COALESCE(datein, dateout)) ="2019-01-02", TIMEDIFF(MAX(dateout), MIN(datein)), NULL) dt2,
    IF(DATE(COALESCE(datein, dateout)) ="2019-01-03", TIMEDIFF(MAX(dateout), MIN(datein)), NULL) dt3,
    IF(DATE(COALESCE(datein, dateout)) ="2019-01-04", TIMEDIFF(MAX(dateout), MIN(datein)), NULL) dt4,
    IF(DATE(COALESCE(datein, dateout)) ="2019-01-05", TIMEDIFF(MAX(dateout), MIN(datein)), NULL) dt5,
    TIMESTAMPDIFF(SECOND, MIN(datein), MAX(dateout)) rt
  FROM registration
  GROUP BY rfid_id, dt
  ) r
GROUP BY r.rfid_id



Если устраивает, обвеску сами добейте.
Еще замечаний:
- Начните с users, тогда не понадобится правых джойнов
- workplaces тоже лучше джойнить
- последнюю группировку лучше по userid, а не по ufio
...
Рейтинг: 0 / 0
Итоги SELECT'a по строке
    #39792675
paver
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Валерий666,
плюс еще:
- у вас notes в запросах лишний
- если база большая, во вложенном селекте стоит сделать дополнительный фильтр по попаданию datein и dateout в заданный период.
- возможно помогут индексы по DATE(datein) и ВФЕУ(dateout), но тут большие сомнения.
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Итоги SELECT'a по строке
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]