【问题标题】:MySQL calculating the Average and difference for each value?MySQL计算每个值的平均值和差异?
【发布时间】:2014-12-08 18:24:36
【问题描述】:

我是 MySQL 新手,我正在尝试编写一个查询来确定一列的平均值以及每个值与该列的差异。 例如:

Expected Output:
Price   Average   Difference
  2        4          -2
  7        4           3
  3        4          -1  

这是我希望的结果,但我无法完全正确地使用语法 这是我的代码:

SELECT Price, AVG(Price) AS Average,
(AVG(Price) - Price) AS Difference
FROM Item_Price
GROUP BY Price;

我的结果是:

Price   Average   Difference
  2        2           0
  7        7           0
  3        3           0  

有什么建议吗? (这是我正在使用的表)

Table: Item_Price

PriceID   Price   Item
   1        2     Ball
   2        7     Socks
   3        3     Book

【问题讨论】:

  • 这张表的主键在哪里?你为什么按价格分组?你的预期输出是什么?
  • 如果您按价格分组,那么价格将始终不等于平均价格,在您的示例中,您如何获得该平均价格?还是您想要的不是平均数?
  • 我很抱歉,我想它与上面的表名混淆了,(我将其包含在查询中以供参考)我将重新编辑它的表

标签: mysql sql syntax average mean


【解决方案1】:

一种方法是使用内联视图获取平均值,然后将内联视图查询(一行)的结果连接到表中的每一行。

举个例子:

SELECT t.Price
     , s.Average
     , t.Price - s.Average AS Difference
  FROM ( SELECT AVG(r.Price) AS Average
           FROM Item_Price r
       ) s
 CROSS
  JOIN Item_Price t

这不是唯一的方法;还有其他查询表单会返回等效结果。

【讨论】:

  • @imran:内联视图查询只返回一行,我们希望该行与 Item_Price 表中的每一行相匹配。因此,没有任何连接谓词,也就是说,没有条件可以放入 ON 子句。在 MySQL 中,包含CROSS 关键字是完全可选的,它没有任何作用;它可以很容易地被省略。但我更喜欢在我们省略 ON 子句时包含它,主要是为了向未来的读者提示省略 ON 子句是有意的,其次是为了与可能需要它的其他数据库兼容。最好包括ON 1=1
【解决方案2】:
select price, average, (average - price) as difference
from item_price, (select AVG(Price) AS Average from item_price);

【讨论】:

  • 关闭,您需要平均价格和子查询的别名。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-03-21
  • 2020-11-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多