Поиск значений LEAST/GREATEST из комбинированных столбцов, игнорировать 0 и NULL- MYSQL
У меня есть набор данных с кучей строк для ежемесячных выплат заработной платы для каждого аккаунта. у нас есть 6 столбцов для этого -
Зарплата_1, Зарплата_2, Зарплата_3, Зарплата_4, Зарплата_5 и Зарплата_6.
Иногда зарплаты 3, 4, 5, 6 и иногда 2 не заселены, иногда ни одна не заселена, потому что они безработные. В этом случае у нас есть 0 в поле.
Что мне нужно сделать, это объединить все зарплаты и найти максимальные и минимальные из этих столбцов ---
Select
Greatest(Salary_1, Salary_2, Salary_3, Salary_4, Salary_5, Salary_6) as MaxSal,
Least(COALESCE(Salary_1, Salary_2, Salary_3, Salary_4, Salary_5, Salary_6),0) as MinSal
from
(select
sal1 as Salary_1, Select sal2 as Salary_2, Sal3 as Salary_3, sal4 as Salary_4, Sal5 as Salary_5, Sal6 as Salary_6
from ....)a
Проблема в том, что это возвращает правильное значение для Max Sal, но 0,00 для Min, потому что это минимальное значение, но оно не позволяет мне игнорировать 0s, но в этом случае 0 не является минимальным значением зарплаты, которое я хочу, мне нужно второе самое низкое значение здесь.
Я попытался установить исходные значения Sal1-Sal6 в NULLIF 0, и он возвращает NULL для макс. И 0 для мин.
На что еще я могу взглянуть? COALESCE в сочетании с NULLIF не работает для меня, что было рекомендовано по предыдущим вопросам. Спасибо!
2 ответа
Greatest и Least не игнорируют нули, как функции агрегации; вам нужно что-то сделать, чтобы избежать их. Одним из вариантов является что-то вроде этого:
Greatest(IFNULL(Salary_1 ,0), ...)
Least(
CASE WHEN Salary_1 IS NULL OR Salary_1 = 0 THEN /*some huge value*/ ELSE Salary_1 END
, CASE WHEN Salary_2
....)
Это может быть проще всего развернуть и агрегировать данные:
select id, max(salary), min(salary)
from ((select id, salary_1 as salary from t) union all
(select id, salary_2 as salary from t) union all
. . .
) t
group by id;
Это определенно дороже, чем гигант case
выражение. С другой стороны, он менее подвержен ошибкам.
Реальное предложение - исправить вашу модель данных. Попытка сохранить массив в нескольких столбцах, как правило, является признаком плохой модели данных. Более подходящий метод будет иметь одну строку на salary
вместо того, чтобы поместить их в отдельные столбцы.