2008-6-27 17:06
imake
请教一个SQL的写法
表的模式是:
Works(company,employee,salary)
要求查询哪个公司的员工最多。
我知道可以通过以下语句来查询每个公司对应的人数,但是怎么查哪个公司的人最多呢?
select company,count(*)
from Works
group by company
2008-6-27 17:07
jvkojvkoyu
order by 一下啊
2008-6-27 17:33
visual2006
select company,max(cnt) from
(select company,count(employee) cnt from works group by company)
2008-6-27 18:10
liang573728
select company from(
select company,count(employee) emp
from work
group by company
)
where emp=(
select max(emp2)
from (
select company,count(employee) emp2
from work
group by company
)
)
2008-6-27 18:28
jvkojvkoyu
楼上的语句也太麻烦了
2008-6-27 19:37
caizhuoyi
来一个:
SELECT company, cnt
FROM (SELECT company, COUNT(employee) cnt
FROM works
GROUP BY company
ORDER BY 2 DESC)
WHERE rownum = 1;
2008-6-27 19:52
gthboy
3楼的代码应该很容易看出来执行不了,company后面跟了个分组函数,可是主查询里面又没有group by company。
6楼的有个小问题,就是对于几个公司人数刚好都一样多,谁也不是最多的时候,只能查到一个。
2008-6-27 20:10
caizhuoyi
回复 #7 gthboy 的帖子
若要查询多个相同的最大值,改一下:
SELECT *
FROM (SELECT company, cnt, rank() over(ORDER BY cnt DESC) rn
FROM (SELECT company, COUNT(employee) cnt
FROM works
GROUP BY company))
WHERE rn = 1;
2008-6-27 20:19
gthboy
恩,不错,用了rank和over。我还没有学会这两个东西,只能看懂4楼的,唉!
2008-6-27 21:36
imake
我用的是MySQL测试
SELECT company, cnt
FROM ( SELECT company, COUNT(employee) cnt
FROM works
GROUP BY company
ORDER BY 2 DESC
)
WHERE rownum = 1
但是报错:Every derived table must have its own alias
是只有Oracle才能这样查吗?
2008-6-27 21:41
imake
我给子查询加上别名
SELECT company, cnt
FROM ( SELECT company, COUNT(name) cnt
FROM works
GROUP BY company
ORDER BY 2 DESC
) as a
WHERE rownum = 1
报错:Unknown column 'rownum' in 'where clause'
估计是rownum是Oracle专有的吧。我还见过写top 1 的,但是也没测试通。
谢谢大家
2008-6-27 23:27
caizhuoyi
回复 #11 imake 的帖子
限制返回n行:
oracle:rownum <= n
mysql、postgresql:limit n
sql server:top n
db2:fetch first n rows only
2008-6-28 08:00
jvkojvko
在oracle里面没有top
2008-6-28 08:03
wuhuaT
LZ的是什么?
2008-6-28 10:06
gthboy
我又看了一下,四楼的其实完全可以写作这样:
select company,emp from(
select company,count(employee) emp
from work
group by company
)
where emp=(
select max(count(employee))
from work
group by company);
在各个不同数据库上应该都可以执行
2008-6-28 10:27
caizhuoyi
oracle:
SELECT company, cnt
FROM (SELECT company, COUNT(employee) cnt
FROM works
GROUP BY company
ORDER BY 2 DESC)
WHERE rownum = 1;
mysql/postgresql:
SELECT company, cnt
FROM (SELECT company, COUNT(employee) cnt
FROM works
GROUP BY company
ORDER BY 2 DESC) LIMIT 1;
sql server:
SELECT top 1 company, cnt
FROM (SELECT company, COUNT(employee) cnt
FROM works
GROUP BY company
ORDER BY 2 DESC)
db2:
SELECT company, cnt
FROM (SELECT company, COUNT(employee) cnt
FROM works
GROUP BY company
ORDER BY 2 DESC) FETCH FIRST 1 ROWS ONLY;
2008-6-28 11:08
zhangweicai74
LS是万事通啊:)
2008-6-28 14:22
mylife920
小马哥给留个联系方式吧。
2008-6-28 16:55
jvkojvko
[quote]原帖由 [i]mylife920[/i] 于 2008-6-28 14:22 发表 [url=http://www.itpub.net/redirect.php?goto=findpost&pid=10796418&ptid=1012916][img]http://www.itpub.net/images/common/back.gif[/img][/url]
小马哥给留个联系方式吧。 [/quote]
个人资料里面有我的QQ
2008-6-30 12:05
imake
为什么不能这样写呢?
select company,count(employee)
from works
group by company
having count(employee) = max(count(employee))
页:
[1]
2

Powered by ITPUB论坛