如何计算列的平均值,然后将其包含在oracle的select查询中?

Ash*_*mc4 6 sql oracle

我的桌子是 -

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.


Jus*_*ony 8

你的分组是汇总你的平均值,它是整个表的分组(我假设你这样做是为了允许选择所有的东西)只需将你的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的未来读者提供更多清洁