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

我的桌子是-

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;

结果是

但是我想计算平均值然后显示差异。我能够做到这一点,但是我无法在选择查询中添加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和聚合的信息,以更好地理解该概念。这不仅可以为您提供简单的解决方案,还可以为您提供更多帮助。

下面的答案实际上是大卫的答案。它利用分析功能。基本上,发生的是在每次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的未来读者阅读更整洁的内容

以上是 如何计算一列的平均值,然后将其包含在oracle的select查询中? 的全部内容, 来源链接: utcz.com/qa/400135.html

回到顶部