您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

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

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

您的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 2022/1/1 18:25:41 有411人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶