从组合的COLUMNS中查找LEAST / GREATEST值,忽略0& NULL- MYSQL

时间:2018-06-12 17:12:38

标签: mysql sql coalesce

我有一个数据集,其中包含一堆行,用于每个帐户的月工资付款。我们有6列 -

Salary_1,Salary_2,Salary_3,Salary_4,Salary_5和Salary_6。

有时候工资3,4,5,6,偶尔也不会有2人填补,有时候没有人因为他们失业而被填入。在这种情况下,我们在该领域有0。

我需要做的是结合所有工资并从这些列中找到MAX和MIN ---

   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,因为它是最小值但不会让我忽略0,但在这种情况下0不是最低工资值I想要,我需要第二个最低值。

我已经尝试将原始Sal1-Sal6值设置为NULLIF 0,它返回NULL表示最大值,0表示Min。

我还能看到什么? COALESCE结合NULLIF对我来说没有用,这是以前的问题所推荐的。谢谢!

2 个答案:

答案 0 :(得分:1)

Greatest and 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
   ....)

答案 1 :(得分:0)

这可能是最简单的取消和汇总数据:

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