繁体   English   中英

多列的SQL平均

[英]SQL average from multiple columns

如何从多个列中获得平均值?
例如:

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外的所有列的平均值。 我怎么做?

在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
'

注意:构建查询字符串有点丑陋

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

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

这样做的另一种方式,实际上并没有使用魔术数字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;

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM