我的桌子是-
create table mobile ( id integer, m_name varchar(20), cost integer )
值是-
insert into mobile values(10,'NOkia',100); insert into mobile values(11,'Samsung',150); insert into mobile values(12,'Sony',120);
我知道如何计算列成本的平均值,我的代码是-
select avg(cost) from mobile;
结果是 123
但是我想计算平均值然后显示差异。我能够做到这一点,但是我无法在选择查询中添加avg列-
我的代码是-
SELECT id, m_name as "Mobile Name", cost as Price,avg(cost) as Average, cost-(select avg(cost) from mobile) as Difference FROM mobile group by id,m_name,cost;
输出是-
id Mobile Name Price Average Difference 10 Nokia 100 100 -23 11 Samsung 150 150 27 12 Sony 120 120 -3
我想要的是校正此平均列。
id Mobile Name Price Average Difference 10 Nokia 100 123 -23 11 Samsung 150 123 27 12 Sony 120 123 -3
请帮忙…
您的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和聚合的信息,以更好地理解该概念。这不仅可以为您提供简单的解决方案,还可以为您提供更多帮助。
SELECT AVG(cost)
更新:
下面的答案实际上是大卫的答案。它利用分析功能。基本上,发生的是在每次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;
该解决方案也将为您的SQL的未来读者阅读更整洁的内容