一尘不染

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

sql

我的桌子是-

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

请帮忙…


阅读 431

收藏
2021-03-17

共1个答案

一尘不染

您的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;

该解决方案也将为您的SQL的未来读者阅读更整洁的内容

2021-03-17