【问题标题】:how do I select AVG of multiple columns on a single row如何在单行上选择多列的 AVG
【发布时间】:2010-11-25 00:09:53
【问题描述】:

如何选择多列的平均值?

假设我有一些数据,例如:

X   Y    Z
-------------
6   3    3
5   5    NULL
4   5    6
11  7    8

我想得到类似的东西

AVG
-------------
4
5
5
8.66666667

我试过select avg(x, y, z) from table

但它不起作用。

对查询有什么想法吗?

【问题讨论】:

    标签: sql mysql


    【解决方案1】:

    试试

     Select     (Coalesce(x,0) + Coalesce(y,0) + Coalesce(z,0)) /
           (Coalesce(x/x, 0) + Coalesce(y/y, 0) + Coalesce(z/z, 0))
    

    或

     Select (Coalesce(x,0) + Coalesce(y,0) + Coalesce(z,0)) /
             (Case When x Is Null 0 Else 1 End +
              Case When y Is Null 0 Else 1 End +
              Case When z Is Null 0 Else 1 End)
    

    【讨论】:

    • x/x 技术特别灵巧。
    • 感谢您的回复;还有一件事。也许应该是不同的问题。但无论如何,它就在这里。在 sql server 上执行此操作是否更好(性能方面)?还是用脚本语言计算?
    • 坦率地说,我认为这并不重要。更重要的问题是哪个更易于维护并为未来的开发人员提供更多的清晰度。但是,我会以两种方式对其进行测试。坦率地说,我不确定。大多数性能问题来自磁盘 I/O,而不是处理(CPU 周期),两种方法都将具有相同的 DISk IO... 一种将在数据库服务器上具有更多的 CPU 周期,另一种在数据库服务器上具有更多的 CPU 周期客户...
    • 除以0异常怎么样?
    【解决方案2】:

    您将它们相加,然后除以值的数量。从平均运算的分母中排除 NULL 有点棘手:

    SELECT (IFNULL(x, 0) + IFNULL(y, 0) + IFNULL(z, 0)) /
           (IIF(ISNULL(x), 0, 1) + IIF(ISNULL(y), 0, 1) + IIF(ISNULL(z), 0, 1))
      FROM YourTable
    

    【讨论】:

      【解决方案3】:

      试试:

      (x + y + z) / 3
      

      【讨论】:

      • 不,我认为 OP 想要的是每条记录中值的平均值。
      • 糟糕,误解了这个问题。用可能有用的东西更新了我的回复 - 尽管如果有 NULL 会使事情变得有点复杂......
      猜你喜欢
      • 2015-09-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-18
      • 2015-08-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多