MySQL:如何检查每个组的哪些条目的值大于相应组中的平均值?

时间:2016-10-22 18:05:53

标签: mysql sql

我需要显示每个组的值(由GROUP BY组成),其值大于它所属组的平均值。我试着这样做:

价格> (选择AVG(I.price)                来自项目I,类别C.                在哪里I.itemcode = C.itemcode                GROUP BY C.category)

但它会返回多行,因此无法与">"一起使用。运营商。 那说,我怎么能这样做?提前谢谢!

编辑: 这是完整的查询 SELECT C.category,I.itemname,I.price 从项目I INNER JOIN类别C到I.itemcode = C.itemcode 在哪里I.price> (SELECT AVG(I.price)FROM items I,category C WHERE I.itemcode = C.itemcode GROUP BY C.category) 订购1,2;

2 个答案:

答案 0 :(得分:1)

你需要的是相关的查询。

在主查询中为Category表设置别名,然后在子查询中使用该别名。

SELECT C.category, I.itemname, I.price 
FROM item I INNER JOIN category C on I.itemcode = C.itemcode 
WHERE I.price > (SELECT AVG(Itm.price) FROM items Itm, category Cat 
           WHERE Itm.itemcode = Cat.itemcode 
           and Cat.cateogry = C.category) 
ORDER BY 1, 2;

魔术在这里Cat.category = C.category C是主查询中的Cateogry表,而Cat是子查询的相同Cateogry表。

因此,它将计算与主查询中查询的项目具有相同类别的项目的平均项目价格。

请记住,这不是对性能友好的,因为它可能会计算主查询中每条记录的平均价格。所以要小心。

更好的方法是使用@ Summer-Sky

指出的联接

答案 1 :(得分:1)

或者

SELECT C.category, I.itemname, I.price 
FROM items I 
INNER JOIN category C on I.itemcode = C.itemcode 
JOIN (
    SELECT C.category, AVG(I.price) avgprice  
    FROM items I, category C 
    WHERE I.itemcode = C.itemcode 
    GROUP BY C.category) A on A.category = C.category
WHERE I.price > A.avgprice  ORDER BY 1, 2;