我有一个表格gainfinal
,其中包含三列:countrycode
,year
和values
。
我想计算所有行的z值。 我做了这样一个简单的查询。
SELECT (
`values` - STDDEV( `values` )
) / AVG( `values` ) AS zvalue
FROM `gainfinal`
但查询只返回一行。如何为所有行执行相同的操作?
答案 0 :(得分:0)
您需要子查询来获取聚合值:
SELECT (gf.`values` - stats.average) / stats.s AS zvalue
FROM `gainfinal` gf cross join
(select sttdev(values) as s, avg(values) as average from gainfinal) stats;
在大多数数据库中,原始查询会生成错误,因为它在查询中混合聚合列和非聚合列而没有group by
。解决方案是一个单独的子查询,用于计算。
答案 1 :(得分:0)
这个怎么样?
DECLARE @stdev AS FLOAT, @avg AS FLOAT
SELECT @stdev = STDEV([values]), @avg = AVG([values])
FROM gainfinal
SELECT
countrycode
, year
, [values]
, ([values] - @stdev) / @avg AS zvalue
FROM gainfinal