【问题标题】:Aggregate queries remove zeros聚合查询删除零
【发布时间】:2013-10-08 21:47:06
【问题描述】:

我需要计算几列的平均值,范围从 0 到 5。但是我想从 AVG 计算中排除零。

所以我有类似的东西

SELECT AVG(column1), AVG(column2), AVG(column3) FROM table1
WHERE ???

【问题讨论】:

    标签: mysql sql average


    【解决方案1】:

    AVG() 仅计算非空记录。
    当值与第二个参数匹配时,NULLIF() 将返回 null。

    SELECT AVG(NULLIF(column1,0)), AVG(NULLIF(column2,0)), AVG(NULLIF(column3,0)) FROM table
    WHERE ????
    

    您可以在其中使用 IF(column1 IN (x,y,z), column1, NULL) 创建更复杂的 AVG()。

    注意:如果您的列数据是 REAL 或 FLOAT,那么您应该 ROUND() 或 TRUNCATE() 您在 NULLIF() 中的值。例如:

     AVG( NULLIF( ROUND(column1,3), 0.000 )) AS column1
    

    -- JJ--

    【讨论】:

    • 哇非常好。作为奖励,您不必担心除以零。您可能希望包含a demo
    • 我认为 0 将被准确存储,无论是作为 real 还是作为 float (因此不需要四舍五入)。而且 NULLIF 解决方案真的很好,+1。
    【解决方案2】:

    您可以执行以下操作,将列相加并除以值不等于 0 的行数:

    SELECT SUM(Column1) / SUM (IF(Column1 = 0, 0, 1)),
    SUM(Column2) / SUM (IF(Column2 = 0, 0, 1)),
    SUM(Column3) / SUM (IF(Column3 = 0, 0, 1))
    FROM table1
    

    不是你还必须在分母中除以零(我在上面没有做过)......

    【讨论】:

    • SUM(Column1) / SUM (IF(Column1 = 0, 0, 1)) 不是平均值,avg = sum / count
    • @LuciaPasarin SUM(IF(Colum1=0,0,1)) 是一种计算非零行数的技术DEMO
    • 当然,我没有看到 0, 0, 1 部分。我这边评论太快了,抱歉!
    • 其实这个方法有个缺陷:如果列有NULL,它就不能正确计算结果:10, 0, NULL应该产生10,但是your suggestion will yield 5
    【解决方案3】:

    由于 WHERE 子句排除或包含整行,您将需要三个不同的查询。不过,借助子查询,您可以将它们组合成一个查询:

    SELECT (SELECT AVG(column1) FROM table WHERE column1 != 0) as avg1, 
           (SELECT AVG(column2) FROM table WHERE column2 != 0) as avg2,
           (SELECT AVG(column3) FROM table WHERE column3 != 0) as avg3;
    

    【讨论】:

      【解决方案4】:

      您可以通过将您关心的值相加并除以您关心的值的计数来计算自己的平均值,如下所示:

      select 
        sum(case when column1 = 0 then 0 else column1 end) /
          sum(case when column1 = 0 then 0 else 1 end) as avg1,
        sum(case when column2 = 0 then 0 else column2 end) /
          sum(case when column2 = 0 then 0 else 1 end) as avg2,
        sum(case when column3 = 0 then 0 else column3 end) /
          sum(case when column3 = 0 then 0 else 1 end) as avg3
      FROM table1
      

      【讨论】:

        猜你喜欢
        • 2023-03-19
        • 2017-01-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-11-26
        • 2013-12-06
        • 1970-01-01
        相关资源
        最近更新 更多