我想知道是否有可能通过使用它来获得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
答案 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`