您的group by是汇总您的平均值的总和,并且它是根据整个表格进行分组的(我假设您这样做是为了对所有内容进行选择),只需将avg移到另一个子查询中,删除by的总体组即可解决该问题。
SELECT id, m_name AS "Mobile Name", cost AS Price,
(SELECT AVG(cost) FROM mobile) AS Average,
cost-(SELECT AVG(cost) FROM mobile) AS Difference
FROM mobile;
当您运行基本SELECT AVG(cost)
语句时,它自然会按照指定的列(在本例中为cost)进行分组,因为这就是您要的内容。我建议阅读更多有关GROUP BY和聚合的信息,以更好地理解该概念。这不仅可以为您提供简单的解决方案,还可以为您提供更多帮助。
下面的答案实际上是大卫的答案。它利用分析功能。基本上,发生的是在每次AVG调用中,您都在告诉引擎该功能使用什么(在这种情况下,什么也没有)。可以在这里和这里找到关于解析函数的体面文章,有关此问题的更多信息可以与Google一起找到。
SELECT id, m_name AS "Mobile Name" cost AS Price, AVG(cost) OVER( ) AS Average,
cost - AVG(cost) OVER ( ) AS Difference
FROM mobile
但是,如果您的sql引擎允许使用变量,则可以轻松执行以下答案。实际上,我出于将来的可维护性/可读性而更喜欢此设置。原因是,具有好名的变量可以很好地描述代码的未来阅读者,而解析函数的确需要更多的工作才能读取(特别是如果您不了解over函数)。
另外,此解决方案将同一查询重复两次,因此可能值得将平均值存储在sql变量中。然后,您可以将语句更改为仅使用该全球平均值
这是sql-Server中的变量(您将不得不对其进行调整以适合您自己的sql实例)
DECLARE @my_avg INT;
SELECT @my_avg = AVG(cost) FROM Mobile;
SELECT id, m_name AS "Mobile Name", cost AS Price,
@my_avg AS Average, cost-@my_avg AS Difference
FROM mobile;