【问题标题】:Average from a same row - SQL server同一行的平均值 - SQL Server
【发布时间】:2018-01-21 21:27:37
【问题描述】:

我有一个有 5 列的表。我需要使用 SQL 找到每一行的平均值(忽略 0 列)。我能得到一些帮助吗?

COL1 COL2 COL3 COL4 COL5 AVERAGE
  1    2    3   4     5   3
  4    0    4   0     4   4
  3    0    0   0     9   6
  7    0    0   0     0   7

抱歉,桌子没有清晰。我需要为任何非零值计算每一行的平均值。例如:5 列有 (4,0,4,0,4) 我不需要 12/5 的平均值,我需要 12/3 =4 的平均值。基本上将它除以非零值的数量。它并不总是除以 5

【问题讨论】:

    标签: sql sql-server average


    【解决方案1】:

    这比乍一看有点棘手。不使用数据透视表(这是另一种方法,但在这里可能有点过分),您可以对列求和,然后除以非零列的数量。诀窍是当每一列都为零时,您需要特别注意这一点,否则您将得到除以零的错误:

    SELECT
      COL1, COL2, COL3, COL4, COL5,
      CASE WHEN (COL1 = 0 AND COL2 = 0 AND COL3 = 0 AND COL4 = 0 AND COL5 = 0) 
        THEN 0
        ELSE 
            (COL1 + COL2 + COL3 + COL4 + COL5)
            / (
                CASE WHEN COL1 = 0 THEN 0 ELSE 1 END +
                CASE WHEN COL2 = 0 THEN 0 ELSE 1 END +
                CASE WHEN COL3 = 0 THEN 0 ELSE 1 END +
                CASE WHEN COL4 = 0 THEN 0 ELSE 1 END +
                CASE WHEN COL5 = 0 THEN 0 ELSE 1 END
            )
        END AS AVERAGE
    FROM stats
    

    SQLFiddle

    【讨论】:

      【解决方案2】:

      这是另一个使用CROSS APPLY 的选项。计算平均值时必须小心谨慎。例如,您对值 1、1、2、2、3 的预期平均值是多少? AVG 会返回 1,但如果你期望它是 1.8,你应该在计算平均值之前使用浮点数据类型

      with cte as (
          select * from
              (values
                  (1, 2, 3, 4, 5)
                  ,(4, 0, 4, 0, 4)
                  ,(3, 0, 0, 0, 9)
                  ,(7, 0, 0, 0, 0)
                  ,(1, 1, 2, 2, 3)
              ) t(COL1, COL2, COL3, COL4, COL5)
      )
      
      select
          *
      from
          cte
          cross apply (
              select 
                  average = avg(val) --change to avg(val * 1.0) to get floating point numeric
              from 
                  (values (COL1), (COL2), (COL3), (COL4), (COL5)) t(val) 
              where val > 0
          ) q
      

      【讨论】:

        猜你喜欢
        • 2023-03-24
        • 1970-01-01
        • 1970-01-01
        • 2019-06-09
        • 1970-01-01
        • 2015-11-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多