Использование одной переменной даты между двумя операторами SELECT с ВНУТРЕННИМ ОБЪЕДИНЕНИЕМ и ГРУППИРОВАНИЕМ ПО

#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. К сожалению, это дает аналогичный результат, я получаю сумму всех первых сдвигов (общее количество) независимо от указанной даты.