价值与平均值(价值)之间的差异

时间:2013-11-27 15:15:45

标签: mysql sql

我想知道是否可以像下面一样进行查询。

我有一个包含idvalue的表格。 Exapmle:

 table EXAMPLE
|id        |  value     |
|        1 |          65|
|        2 |          13|
|        3 |          22|

我想要的是使得返回集合的查询如下:

|id        |  value     | average | difference|   
|        2 |          13|     33.3|       20.3|
|        3 |          22|     33.3|       11.3|

问题是如何处理不同的栏目?

还有一个问题:  如何在集合中仅包含小于或大于平均值的值

SELECT id,
       value,
       (SELECT AVG(value) FROM EXAMPLE ) as average
having 
       value <  average.

我使用having而不是where的原因是where在select之前执行,因此我无法使用平均值(平均值是在查询执行的选择阶段计算的)。

我还怀疑我不仅计算一次AVG(值),而且计算表格中的每一行。 我对吗 ?如果我,那是非常糟糕的,这肯定不是我想要的。

请在MySQL子查询的执行顺序上为我了解一下,或者分享一些这个主题的链接。 先感谢您。

4 个答案:

答案 0 :(得分:5)

您必须单独计算总体平均值并强制交叉加入:

SQL Fiddle

select
    id,
    value,
    avgValue,
    avgValue - value as Diff
from
    table1
  cross join
    ( 
      select
          avg(value) as AvgValue
      from
          table1
    ) t2
where
    value < avgValue

答案 1 :(得分:0)

我认为这样做会。您需要进行分组才能聚合函数。

SELECT id, value, (SELECT AVG(value) FROM example GROUP BY id) AS average,
       average - value AS diff
FROM example
GROUP BY id
HAVING value < average;

答案 2 :(得分:0)

select id, value, (select avg(value) from EXAMPLE ) as average, 
   (select avg(value) from EXAMPLE ) - value as difference
   from EXAMPLE ;

答案 3 :(得分:0)

这也可以解决问题

select id, value,
       (select avg(Value) from table1) as avg,
       (select avg(Value) from table1) - value as Diff
from table1 having Diff > 0