我想知道是否可以像下面一样进行查询。
我有一个包含id
和value
的表格。
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子查询的执行顺序上为我了解一下,或者分享一些这个主题的链接。 先感谢您。
答案 0 :(得分:5)
您必须单独计算总体平均值并强制交叉加入:
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