【问题标题】:Finding LEAST/GREATEST values from combined COLUMNS, ignore 0 & NULL- MYSQL从组合列中查找 LEAST/GREATEST 值,忽略 0 和 NULL-MYSQL
【发布时间】:2018-06-12 17:12:37
【问题描述】:

我有一个数据集,其中包含每个帐户的月薪支付行。我们为此设置了 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 不是我想要的最低工资值,我这里需要第二低的值。

我尝试将原始 Sal1-Sal6 值设置为 NULLIF 0,它返回 NULL 为最大值,0 为最小值。

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

【问题讨论】:

    标签: mysql sql coalesce


    【解决方案1】:

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

    【讨论】:

    • 请注意,您也可以使用Least(IFNULL(Salary_1 ,999999999), ...)。需要 CASE 表达式的 LEAST() 没有什么特别之处。
    • @BaconBits 是的,但是 CASE 支持所需的 0 检查(通过 AND),并且跨 RDBMS 对 CASE 的支持更加标准化。
    【解决方案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 有一行,而不是将它们放在单独的列中。

    【讨论】:

      猜你喜欢
      • 2011-04-17
      • 1970-01-01
      • 2019-01-21
      • 2018-12-14
      • 1970-01-01
      • 2023-03-19
      • 2019-05-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多