#sql #database #group-by #inner-join
#sql #База данных #группирование по #внутреннее соединение
Вопрос:
У меня есть таблица с такими столбцами, как: дата, имя сотрудника, номер смены (1,2 или 3). Я хотел бы объединить данные, чтобы получить количество смен для конкретного сотрудника на основе выбранной даты (то есть до указанной даты). Мне нужно видеть такие столбцы, как: дата, имя сотрудника, номер смены (1,2 или 3), общее количество сдвигов до даты, указанной в первом столбце.
Используя ВНУТРЕННЕЕ СОЕДИНЕНИЕ с двумя операторами выбора, я могу получить общее количество смен для всех дат, например (сдвиг 1):
SELECT *
FROM employees a
INNER JOIN (SELECT employee, COUNT(value) AS shifts FROM employees WHERE value='1' GROUP BY employee) b ON b.employee=a.employee
WHERE date>='2020-11-05'
Как я могу изменить свой запрос, чтобы показывать только сумму смен для каждого сотрудника до выбранной даты?
Спасибо за любую помощь!
Редактировать: образец данных по запросу, что у меня есть:
date employee value
2020-11-05 X 1
2020-11-05 Y 2
2020-11-05 Z 3
2020-11-06 X 1
2020-11-06 Y 2
2020-11-06 Z 3
Что мне нужно:
date employee value shifts_1
2020-11-05 X 1 1
2020-11-05 Y 2 0
2020-11-05 Z 3 0
2020-11-06 X 1 2
2020-11-06 Y 2 0
2020-11-06 Z 3 0
Подводя итог, в этом случае в последнем столбце должно отображаться количество первых смен, которые были назначены каждому сотруднику до указанной даты.
Комментарии:
1. Пожалуйста, предоставьте образцы данных, желаемые результаты и соответствующий тег базы данных.
Ответ №1:
ВЫБЕРИТЕ *, b.SumOfShifts, b.сдвиги ОТ сотрудников ВНУТРЕННЕЕ ОБЪЕДИНЕНИЕ (ВЫБЕРИТЕ сотрудника, ПОСЧИТАЙТЕ (значение) КАК сдвиги, СУММИРУЙТЕ (значение) как SumOfShifts ОТ сотрудников, ГДЕ значение = ‘1’ ГРУППА ПО сотруднику) b НА b.employee=a.employee ГДЕ дата> = ‘2020-11-05’
Комментарии:
1. «Значение» указывает, какой сдвиг был назначен сотруднику на заданную дату, поэтому, к сожалению, результат запроса: «Тип данных операнда varchar недопустим для оператора sum».
2. О, я неправильно понял проблему. Вы пробовали: SET IValue = CAST(ValueAS int)
3. Хм, после приведения значения как int и использования точного запроса из вашего ответа я получаю два столбца (shifts и SumOfShifts) с одинаковыми значениями, которые являются суммой всех первых смен для каждого сотрудника, но это значение является постоянным независимо от указанной даты.
4. ВЫБЕРИТЕ *, b.сдвиги ОТ employees к ВНУТРЕННЕМУ ОБЪЕДИНЕНИЮ (ВЫБЕРИТЕ employee, COUNT((ПРИВЕДЕНИЕ (значение КАК int))) КАК сдвиги ОТ employees, ГДЕ значение = ‘1’ ГРУППИРУЕТСЯ ПО employee) b НА b.employee=a.employee, ГДЕ date> =’2020-11-05′.
5. К сожалению, это дает аналогичный результат, я получаю сумму всех первых сдвигов (общее количество) независимо от указанной даты.