ITPUB论坛 » Oracle开发 » 请教一个SQL的写法


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
查看完整版本: 请教一个SQL的写法


Powered by ITPUB论坛