【问题标题】:SQL average from multiple columns多列的 SQL 平均值
【发布时间】:2014-08-15 09:53:26
【问题描述】:

如何获得多列的平均值?
例如:

Columns:   ID 125Hz 250Hz 500Hz 750Hz 1000Hz 1500Hz 2000Hz 3000Hz 4000Hz 6000Hz 8000Hz
Values:    1  92    82     63    83    32     43     54     56     54     34      54

我想获取除 ID 之外的所有列的平均值。我该怎么做?

【问题讨论】:

  • 添加列并除以 11
  • 所以你可以有以数字开头的列名...今天学到了一些东西。
  • @AlexandreSantos,使用带引号的标识符,您甚至可以拥有几乎整个 Unicode BMP,包括空格字符 (dev.mysql.com/doc/refman/5.6/en/identifiers.html)。但是,我发现对象名称的前导数字非常令人讨厌。很容易与常规数字混合并产生意想不到的问题。非常气馁!

标签: mysql sql sql-server mysql-workbench


【解决方案1】:

您必须手动添加列,因为没有可用于水平聚合的内置函数。

select (125Hz+250Hz+500Hz+750Hz+1000Hz+1500Hz+2000Hz+3000Hz+4000Hz+6000Hz+8000Hz)/11 as aveHz from table_name

【讨论】:

    【解决方案2】:
    SELECT sum(125Hz + 250Hz + 500Hz + 750Hz + 1000Hz + 1500Hz + 2000Hz + 3000Hz + 
    4000Hz + 6000Hz + 8000Hz)/11 as averageHz from TABLE
    

    【讨论】:

    • 哦,michikot 打败了我。
    【解决方案3】:

    另一种方法,不用实际使用幻数11,更详细一点。

    WITH t1 AS
    (
        SELECT * FROM myTable
        WHERE (...) -- Should limit result to 1 row
    ),
    t2 AS
    (
        SELECT col1 FROM t1
        UNION ALL
        SELECT col2 FROM t1
        UNION ALL
        (...)
    )
    SELECT AVG(col1) FROM t2;
    

    【讨论】:

      【解决方案4】:

      在 SQL-SERVER 中你可以使用这个

      DECLARE @total int
      DECLARE @query varchar(550)
      DECLARE @ALLColumns VARCHAR(500)
      SET @ALLColumns = ''
      
          ----Build the string columns
      SELECT  @ALLColumns = @ALLColumns + '+' + '['+sc.NAME+']'
      FROM sys.tables st
      INNER JOIN sys.columns sc ON st.object_id = sc.object_id
      WHERE st.name LIKE '%YOUR_TABLE_NAME%' 
      AND sc.NAME LIKE  '[0-9]%';--[0-9]% just get the column that start with number
          ----Get the total number of column, 
      SELECT @total = count(*) FROM sys.tables st
      INNER JOIN sys.columns sc ON st.object_id = sc.object_id
      WHERE st.name LIKE '%YOUR_TABLE_NAME%' 
      AND sc.NAME LIKE  '[0-9]%';--[0-9]% just get the column that start with number
      
      SET @query = 'SELECT SUM('+ SUBSTRING(@ALLColumns,2,LEN(@ALLColumns))+')/'
          +CAST(@total as varchar(4))+ ' AS [AVG] 
          FROM [YOUR_TABLE_NAME] 
          GROUP BY [ID]'
      
      --SELECT @query 
      EXECUTE(@query) 
      

      这将执行如下查询:

      SELECT SUM([125Hz]+[250Hz]+[500Hz]+[750Hz]+[1000Hz]+[1500Hz]+[2000Hz]
                 +[3000Hz]+[4000Hz]+[6000Hz]+[8000Hz])/11 AS [AVG] 
      FROM [YOUR_TABLE_NAME] GROUP BY [ID]
      

      更新

      添加一列来存储平均值,我称之为[AVG]并将@query的值更改为

      SET @query = '
      CREATE TABLE #Medition (ID int,[AVG] decimal(18,4))
      INSERT INTO #Medition (ID,[AVG]) 
      SELECT ID,SUM ('+ SUBSTRING(@ALLColumns,2,LEN(@ALLColumns))+')/'
      +CAST(@total as varchar(10)) 
      + ' AS [AVG] FROM Medition GROUP BY ID
      UPDATE YOUR_TABLE_NAME  SET YOUR_TABLE_NAME.[AVG] = #Medition.[AVG]
      FROM YOUR_TABLE_NAME INNER JOIN #Medition ON YOUR_TABLE_NAME.ID =#Medition.ID
      DROP TABLE #Medition
      '
      

      注意:构建查询字符串有点难看

      【讨论】:

      • 可以把平均值放到一列吗?
      • 除了插入语句外,我什么都懂。不应该是 INSERT INTO #Medition (ID, AVG) VALUES 然后是 select 语句吗?
      • 另外我不明白你所说的 '+ SUBSTRING(@ALLColumns,2,LEN(@ALLColumns))+' 是什么意思我只是添加这样的所有列:[125Hz]+[250Hz ]+[500Hz]+[750Hz]+[1000Hz]+[1500Hz]+[2000Hz]+[3000Hz]+[4000Hz]+[6000Hz]+[8000Hz]?
      • 插入语句,当你从另一个表插入值时就是这样see
      • SUBSTRING 删除字符串开头的空格和+ 符号,使用@query...取消注释此SELECT @query 并注释EXECUTE(@query) 并查看查询字符串
      【解决方案5】:

      这将显示您拥有的每个 ID 的所有字段的平均值。

      SELECT AVG(125Hz+250Hz+500Hz+750Hz+1000Hz+1500Hz+2000Hz+3000Hz+4000Hz+6000Hz+8000Hz) 
      AS Average FROM table
      GROUP BY ID
      

      【讨论】:

        猜你喜欢
        • 2018-07-12
        • 1970-01-01
        • 1970-01-01
        • 2023-01-31
        • 1970-01-01
        • 2013-07-06
        • 2021-09-06
        • 1970-01-01
        相关资源
        最近更新 更多