从许多列中获取Var()和AVG()

时间:2014-02-25 12:17:29

标签: sql sql-server database

我正在构建一个查询,以显示来自多列的平均值和方差。

为了获得平均值,我使用了这个:

SELECT *,
   (SELECT AVG(t.c)
    FROM   (
            SELECT peca_1 UNION ALL
            SELECT peca_2 UNION ALL
            SELECT peca_3 UNION ALL
            SELECT peca_4 UNION ALL
            SELECT peca_5 UNION ALL
            SELECT peca_6 UNION ALL
            SELECT peca_7 UNION ALL
            SELECT peca_8 UNION ALL
            SELECT peca_9 UNION ALL
            SELECT peca_10
                  )  t(c)
    )  as [media]
from Durabilidade
where cd_durabilidade = 1

结果是:

enter image description here

现在我需要一个带有VAR(媒体)的新列,将每行与第一行进行比较。

有什么想法吗?

2 个答案:

答案 0 :(得分:0)

这样的东西?

SELECT *,
  VAR(media) AS [variance]
FROM
(    
 SELECT *,
   (SELECT AVG(t.c)
    FROM   (
            SELECT peca_1 UNION ALL
            SELECT peca_2 UNION ALL
            SELECT peca_3 UNION ALL
            SELECT peca_4 UNION ALL
            SELECT peca_5 UNION ALL
            SELECT peca_6 UNION ALL
            SELECT peca_7 UNION ALL
            SELECT peca_8 UNION ALL
            SELECT peca_9 UNION ALL
            SELECT peca_10
                  )  t(c)
    )  as [media]
 from Durabilidade
 where cd_durabilidade = 1
) x
GROUP BY
 column1_from_durabilidade
 ,column2_from_durabilidade
 --etc
 ,media

答案 1 :(得分:0)

我认为这是cross apply合适的情况。我假设你想要由var()函数计算的值的方差:

SELECT *, t.avgval as [media], t.varval
from Durabilidade d cross apply
     (select avg(t.val) as avgval, var(t.val) as varval
      from (select d.peca_1 union all
            select d.peca_2 union all
            select d.peca_3 union all
            select d.peca_4 union all
            select d.peca_5 union all
            select d.peca_6 union all
            select d.peca_7 union all
            select d.peca_8 union all
            select d.peca_9 union all
            select d.peca_10
           ) t(val) -- t(val) to work
     ) t
where cd_durabilidade = 1