Я хочу иметь сумму столбца, основанную на том, что значение другого столбца равно этому/этому. Вот моя структура таблицы
id leave_hours leave_type overtime_hours employee_id
1 7.6 1 0 3
2 5 2 0 3
3 0 0 2.3 3
У меня уже есть этот запрос, но мне нужен столбец, который будет суммироваться только в том случае, если тип выхода равен 1 и если тип выхода равен 2.
SELECT employee_id, SUM(overtime_hours) AS ot_hrs, SUM(leave_hours if leave_type == 1) AS
leave_1, SUM(leave_hours if leave_type == 2) AS leave_2
FROM table
GROUP BY employee_id
Результат должен быть:
employee_id ot_hrs leave_1 leave_2
3 2.3 7.6 5
Спасибо за ваш вклад.
Вашего описания недостаточно, чтобы предложить лучшее решение.
отредактировал вопрос, чтобы отразить результат и запрос суммы.
Вам нужно использовать условную агрегацию, чтобы суммировать разные leave_hours
по отдельности:
SELECT employee_id,
SUM(overtime_hours) AS ot,
SUM(CASE WHEN leave_type = 1 THEN leave_hours ELSE 0 END) AS leave_1,
SUM(CASE WHEN leave_type = 2 THEN leave_hours ELSE 0 END) AS leave_2
FROM `table`
GROUP BY employee_id
Выход:
employee_id ot leave_1 leave_2
3 2.3 7.6 5
Обратите внимание, что если вы используете числа с плавающей запятой для хранения часов, вам может потребоваться ROUND
результаты.
При этом лучше использовать NULL вместо 0. Таким образом, у вас не будет существования какой-либо записи, которую вы считаете не, измените результат с NULL на 0.
не нужен круглый, но этот работает. просто отредактируйте его без раунда, и я поставлю это как принятый ответ.
Демо на dbfiddle использует FLOAT
для чисел, а 2.3 и 7.6 не могут быть точно представлены как числа с плавающей запятой. Поэтому я округляю их, а не показываю 2.29999999837424
и т. д.
@Ronald ROUNDing удален.
Ах. В большинстве случаев лучше использовать десятичное число, а не число с плавающей запятой.
@ysth действительно. Режим db-fiddle по умолчанию, когда вы просто вводите данные таблицы, всегда выбирает FLOAT
, мне просто нужно не забыть изменить его...
вы можете использовать max()
с случаем, когда
SELECT employee_id,
max(overtime_hours) AS ot,
max(CASE WHEN leave_type = 1 THEN leave_hours END) AS leave_1,
max(CASE WHEN leave_type = 2 THEN leave_hours END) AS leave_2
FROM table_name
GROUP BY employee_id
выход
employee_id ot leave_1 leave_2
3 2.3 7.599999904632568 5
Могу ли я узнать причину использования MAX?
@Ronald, вам нужен поворот, который можно легко сделать с помощью max() db-fiddle.com/f/pNw42Q4yRiMhA7qFGTEZ4R/2
@ Рональд, я предполагаю, потому что в ваших данных показана только одна запись для leave_type/employee; max тогда будет эквивалентно сумме. Но я предполагаю, что у вас может быть больше одного.
Что вы хотите подытожить?