Sql 如何将AVG()应用于行而不是列?

Sql 如何将AVG()应用于行而不是列?,sql,sql-server,Sql,Sql Server,我有一个从数据库获取数据的过程,作为示例,最终结果如下: Column1 |Column2 |Column3 |Column4 |Column5 |Column6 --------|----------------|--------------|------------|------------|------- 1 |2 |1111 |001 |345.000000 |22

我有一个从数据库获取数据的过程,作为示例,最终结果如下:

Column1 |Column2         |Column3       |Column4     |Column5     |Column6
--------|----------------|--------------|------------|------------|-------
 1      |2               |1111          |001         |345.000000  |22
 3      |5               |1111          |001         |700.000000  |22
 1      |0               |1112          |001         |345.000000  |22
 2      |7               |5454          |001         |1200.000000 |22
 2      |5               |2364          |001         |1350.000000 |22
我希望每行应用AVG函数,这意味着我希望添加第7列,在该列下,该特定行第1、2、3、4、5和6列的所有值的AVG都是“平均值”


请注意,某些数据可以为空

您可以使用算术:

select (column1 + column2 + column3 + column4 + column5 + column6) / 6
如果要将其添加到表中,可以使用计算列:

alter table t add column column7 as 
    (column1 + column2 + column3 + column4 + column5 + column6) / 6);

我应该注意,如果任何值是
NULL
,则返回的值将是
NULL
。这是可以修复的,但是您的所有示例数据都是非空的

您可以使用算术:

select (column1 + column2 + column3 + column4 + column5 + column6) / 6
如果要将其添加到表中,可以使用计算列:

alter table t add column column7 as 
    (column1 + column2 + column3 + column4 + column5 + column6) / 6);

我应该注意,如果任何值是
NULL
,则返回的值将是
NULL
。这是可以修复的,但是您的所有示例数据都是非空的

另外一个选项是
表值构造函数:

SELECT 
   t.*,
   Column7 = (
      SELECT AVG(x) 
      FROM (VALUES (Column1), (Column2), (Column3), (Column4), (Column5), (Column6)) v(x)
   )
FROM YourTable t

另一个选项是
表值构造函数:

SELECT 
   t.*,
   Column7 = (
      SELECT AVG(x) 
      FROM (VALUES (Column1), (Column2), (Column3), (Column4), (Column5), (Column6)) v(x)
   )
FROM YourTable t

但除法将始终为6,这将影响数学结果–Houssem Timoumi

你必须多写一点:

alter table t add  column7 as 
( ( ISNULL (column1, 0)
  + ISNULL (column2, 0)
  + ISNULL (column3, 0)
  + ISNULL (column4, 0)
  + ISNULL (column5, 0)
  + ISNULL (column6, 0)
  )  
  / CASE  WHEN column1 IS NULL THEN 0 ELSE 1 END  
  + CASE  WHEN column2 IS NULL THEN 0 ELSE 1 END  
  + CASE  WHEN column3 IS NULL THEN 0 ELSE 1 END  
  + CASE  WHEN column4 IS NULL THEN 0 ELSE 1 END  
  + CASE  WHEN column5 IS NULL THEN 0 ELSE 1 END  
  + CASE  WHEN column6 IS NULL THEN 0 ELSE 1 END  
);

但除法将始终为6,这将影响数学结果–Houssem Timoumi

你必须多写一点:

alter table t add  column7 as 
( ( ISNULL (column1, 0)
  + ISNULL (column2, 0)
  + ISNULL (column3, 0)
  + ISNULL (column4, 0)
  + ISNULL (column5, 0)
  + ISNULL (column6, 0)
  )  
  / CASE  WHEN column1 IS NULL THEN 0 ELSE 1 END  
  + CASE  WHEN column2 IS NULL THEN 0 ELSE 1 END  
  + CASE  WHEN column3 IS NULL THEN 0 ELSE 1 END  
  + CASE  WHEN column4 IS NULL THEN 0 ELSE 1 END  
  + CASE  WHEN column5 IS NULL THEN 0 ELSE 1 END  
  + CASE  WHEN column6 IS NULL THEN 0 ELSE 1 END  
);

谢谢但是,当值为空时,有没有办法不考虑这些值?我的意思是像AVG函数一样,当一个值为null时,它会被跳过。@HoussemTimoumi-您可以添加where类来忽略null,其中column1不为null,column2不为null等等……但是除法将始终是6,这将影响数学结果谢谢!但是,当值为空时,有没有办法不考虑这些值?我的意思是像AVG函数一样,当一个值为null时,它被跳过。@HoussemTimoumi-您可以添加where类来忽略null,其中column1不为null,column2不为null等等……但是除法将始终是6,这将影响数学结果