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

时间:2011-09-28 21:21:17

标签: sql

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

SELECT 
  AVG(salary)
  , g.emp_id 
FROM #emp e ,#salary d 
WHERE e.emp_id=d.emp_id 
GROUP BY e.emp_id

5 个答案:

答案 0 :(得分:2)

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

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:http://msdn.microsoft.com/en-us/library/bb522495.aspx
MySQL:http://dev.mysql.com/doc/refman/5.0/en/group-by-modifiers.html

<强>备注
不要使用隐式SQL '89语法,因为我喜欢Bill Joel的we didn't start the fire现在是时候转向更好的SQL'92的显式连接语法了。
至于歌曲,1989年确实有更好的year

答案 1 :(得分:2)

一个选项

SELECT  e.emp_id ,
    ( SELECT    AVG(salary)
      FROM      #salary d
      WHERE     d.emp_id = e.emp_id )
FROM    #emp e

答案 2 :(得分:0)

如果你真的想这样做,你可以选择SELECT ... ORDER BY员工,然后写一个光标来计算平均零碎。但是,我认为没有任何理由这样做。

答案 3 :(得分:0)

你在找这样的东西吗?

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以及为所有员工计算的平均工资(因此它将包含所有行的相同信息)。

答案 4 :(得分:0)

尝试一下:

select * from (SELECT AVG(salary) , g.emp_id FROM #emp e ,#salary d WHERE e.emp_id=d.emp_id GROUP BY e.emp_id)a`