从组合列中查找最小/最大值,忽略0&null-mysql

bpsygsoo  于 2021-06-21  发布在  Mysql
关注(0)|答案(2)|浏览(492)

我有一个数据集,每个账户的月薪都有一堆行。我们有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的正确值,而min返回的是0.00,因为这是最小值,但不允许忽略0s,但在这种情况下,0不是我想要的最小薪资值,我需要第二个最小值。
我尝试过将原始的sal1-sal6值设置为nullif 0,它返回null表示max,0表示min。
我还能看什么?与nullif相结合的coalesce对我不起作用,这是在前面的问题上所建议的。谢谢!

r7s23pms

r7s23pms1#

最大值和最小值不会像聚合函数那样忽略空值;你需要做点什么来避免他们。一种选择是这样的:

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
   ....)
voase2hg

voase2hg2#

这可能是最简单的取消IVOT和聚合数据:

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 而不是把它们放在不同的列中。

相关问题