如何在sql中不使用GROUPBY语句查找平均值

如何在sql中不使用GROUPBY语句查找平均值,sql,Sql,我想知道是否有可能通过使用它来获得group的功能。 我需要在不使用分组的情况下找到平均值。 基本上,我正在为下面的简单查询寻找一种替代方法,而不使用GROUPBY 如果你真的想这么做,你可以选择。。。按员工排序,然后写一个光标以逐段计算平均值。不过,我看不出有什么好的理由这么做。你在找这样的东西吗 SELECT AVG(d.salary) over (partition by null), e.emp_id FROM #emp e JOIN #salary d ON e.e

我想知道是否有可能通过使用它来获得group的功能。 我需要在不使用分组的情况下找到平均值。 基本上,我正在为下面的简单查询寻找一种替代方法,而不使用GROUPBY


如果你真的想这么做,你可以选择。。。按员工排序,然后写一个光标以逐段计算平均值。不过,我看不出有什么好的理由这么做。

你在找这样的东西吗

SELECT AVG(d.salary) over (partition by null),
       e.emp_id 
FROM #emp e
  JOIN #salary d ON e.emp_id = d.emp_id;
它将返回所有员工ID和为所有员工计算的平均工资,因此它将包含所有行的相同信息。

如果您的数据库支持分区,您可以执行以下操作:

SELECT e.emp_id
       , AVG(s.salary) OVER(PARTITION BY s.emp_id) AS average_salary
FROM #emp e
INNER JOIN #salary s ON (e.emp_id = s.emp_id)
然而,我看不出这项工作的目的。 它只会使您的查询更难阅读、更难调试,并用晦涩的代码替换常用语法

岩石群 您是否知道,即使是作为“赠款总额”功能内置的group by

SELECT 
  AVG(d.salary)
  , e.emp_id 
FROM #emp e 
INNER JOIN #salary s ON (e.emp_id = s.emp_id) 
GROUP BY e.emp_id WITH ROLLUP
请参阅:SQL server: MySQL:

评论 不要使用隐式SQL'89语法,因为我很喜欢Bill Joel的《我们并没有引发火灾》是时候继续使用更好的SQL'92显式连接语法了。 至于歌曲,1989年确实有一个更好的选择:

一个选择

SELECT  e.emp_id ,
    ( SELECT    AVG(salary)
      FROM      #salary d
      WHERE     d.emp_id = e.emp_id )
FROM    #emp e
试试这个:

从选择中选择* AVGsalary ,g.emp_id 来自emp e,薪金d 其中e.emp_id=d.emp_id
GROUP BY e.emp_id a`

为什么要避免GROUP BY?Tushar,不要使用隐式SQL'89语法,这是一种反模式,而是使用显式联接语法:从e.emp_id=s上的emp e内部联接薪资s中选择AVGd.salary,e.emp_id。emp_id GROUP BY e.emp_id这看起来像是在试图获得每位员工的平均值。或者你只想要一个数字——所有员工的平均值?这就是group by的设计目的,任何其他方法都会降低效率,所以我支持Jim的问题。也许您对结果集的格式有要求,但您没有共享?是的,我需要基于员工id的每个员工的平均值。我正在寻找不考虑效率的替代方案。是的,这就是我所寻找的。非常感谢。您知道如何在SQL'92的显式联接语法中更正此问题吗。@Tushar,这使用子查询而不是联接,因此没有要重写的联接。谢谢Johan,我将尝试学习92的语法。你能告诉我如何用92的语法写出大卫给出的答案吗?
SELECT  e.emp_id ,
    ( SELECT    AVG(salary)
      FROM      #salary d
      WHERE     d.emp_id = e.emp_id )
FROM    #emp e