我的桌子是 -
create table mobile
(
id integer,
m_name varchar(20),
cost integer
)
Run Code Online (Sandbox Code Playgroud)
而价值观是 -
insert into mobile values(10,'NOkia',100);
insert into mobile values(11,'Samsung',150);
insert into mobile values(12,'Sony',120);
Run Code Online (Sandbox Code Playgroud)
我知道如何计算柱成本的平均值,我的代码是 -
select avg(cost) from mobile;
Run Code Online (Sandbox Code Playgroud)
结果是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;
Run Code Online (Sandbox Code Playgroud)
输出是 -
id Mobile Name Price Average Difference
10 Nokia 100 100 -23
11 Samsung 150 150 27
12 Sony 120 120 -3
Run Code Online (Sandbox Code Playgroud)
我想要的是纠正这个平均列..我想要这个---
id Mobile Name Price Average Difference
10 Nokia 100 123 -23
11 Samsung 150 123 27
12 Sony 120 123 -3
Run Code Online (Sandbox Code Playgroud)
请帮忙...
Dav*_*ber 11
由于您使用的是Oracle,因此您应该能够使用AVG()作为分析(窗口)函数:
SELECT id, m_name AS "Mobile Name" cost AS Price, AVG(cost) OVER( ) AS Average
, cost - AVG(cost) OVER ( ) AS Difference
FROM mobile
Run Code Online (Sandbox Code Playgroud)
不需要子查询或GROUP BY.
你的分组是汇总你的平均值,它是整个表的分组(我假设你这样做是为了允许选择所有的东西)只需将你的avg移动到另一个子查询中,删除总体分组,然后解决它.
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;
Run Code Online (Sandbox Code Playgroud)
当您运行基本SELECT AVG(cost)语句时,它自然地按指定的列(在这种情况下为成本)进行分组,因为这是您请求的内容.我建议阅读更多关于GROUP BY和聚合的内容,以便更好地掌握这个概念.这应该不仅仅是一个简单的解决方案.
更新:
下面的答案实际上来自大卫的回答.它利用了分析功能.基本上,正在发生的事情是,在每个AVG调用中,您告诉引擎该功能使用什么(在这种情况下,什么都没有).关于分析函数的一个体面的文章可以在这里和这里找到,还有更多关于这个问题的谷歌.
SELECT id, m_name AS "Mobile Name" cost AS Price, AVG(cost) OVER( ) AS Average,
cost - AVG(cost) OVER ( ) AS Difference
FROM mobile
Run Code Online (Sandbox Code Playgroud)
但是,如果您的SQL引擎允许变量,您可以轻松地执行以下答案.我实际上更喜欢这个用于将来的可维护性/可读性.原因是具有良好名称的变量可以非常描述代码的未来读者,而不是需要更多工作来阅读的分析函数(特别是如果您不理解过度函数).
此外,此解决方案两次复制相同的查询,因此可能值得将您的平均值存储在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;
Run Code Online (Sandbox Code Playgroud)
此解决方案也将为您的SQL的未来读者提供更多清洁
| 归档时间: |
|
| 查看次数: |
93868 次 |
| 最近记录: |