日期:2014-05-18 浏览次数:20488 次
create table Test ( 部门 char(6), 姓名 varchar(6), 薪资 money ) go insert into Test values('市场部','张三',6000) insert into Test values('市场部','李四',6000) insert into Test values('市场部','王五',5000) insert into Test values('工程部','赵柳',3400) insert into Test values('工程部','立白',24000) insert into Test values('工程部','雕牌',10000) insert into Test values('策划部','海丝',2000) insert into Test values('策划部','李波',12000) go --题目:找出各部门薪资最高的人 --1.常规做法:相关子查询实现 select 部门,姓名,薪资 from Test a where 薪资=(select max(薪资) from test b where a.部门=b.部门) /*************** =========查询结果=========== 部门 姓名 薪资 ------ ------ --------------------- 策划部 李波 12000.00 工程部 赵柳 24000.00 市场部 张三 6000.00 (3 行受影响) ****************/ --以上结果无法满足薪资相同的情况 ------------------------------------ --2.常规做法:找出每个部门的最大薪资,然后子查询匹配 select test.部门,test.姓名,test.薪资 from Test, (select 部门,max(薪资)薪资 from test group by 部门)t where Test.部门=t.部门 and test.薪资=t.薪资 /********* =========查询结果=========== 部门 姓名 薪资 ------ ------ ---------------- 市场部 张三 6000.00 市场部 李四 6000.00 工程部 立白 24000.00 策划部 李波 12000.00 (4 行受影响) */ --以上结果正确 --------------------------------------------------------- /* *以下的分组函数,相对Group by与 compute更好用,用得也比较多,大家可以根据实际情况,自由选择。 *下面我只是做简单介绍,有兴趣的可以看看帮助文档,或者上网查询一下。 */ --row_number() /* *row_number()中的partition by就是按那个字段进行分组,并对分组后的数据进行编号 *如果没有当前字段,那么就是按排序从1开始编号。 */ --实验 select rowid=row_number() over(order by 薪资 desc),* from Test select rowid=row_number() over(partition by 部门 order by 薪资 desc),* from Test /* 以上两条语句查询结果 rowid 部门 姓名 薪资 -------------------- ------ ------ --------------------- 1 工程部 立白 24000.00 2 策划部 李波 12000.00 3 工程部 雕牌 10000.00 4 市场部 张三 6000.00 5 市场部 李四 6000.00 6 市场部 王五 5000.00 7 工程部 赵柳 3400.00 8 策划部 海丝 2000.00 (8 行受影响) rowid 部门 姓名 薪资 -------------------- ------ ------ --------------------- 1 策划部 李波 12000.00 2 策划部 海丝 2000.00 1 工程部 立白 24000.00 2 工程部 雕牌 10000.00 3 工程部 赵柳 3400.00 1 市场部 张三 6000.00 2 市场部 李四 6000.00 3 市场部 王五 5000.00 (8 行受影响) */ --通过以上结果我们可以通过rowid来查询,但同样无法解决薪资相同的情况 with t as( select rowid=row_number() over(partition by 部门 order by 薪资 desc),* from Test) select * from t where t.rowid=1 /*结果如下: rowid 部门 姓名 薪资 -------------------- ------ ------ --------------------- 1 策划部 李波 12000.00 1 工程部 立白 24000.00 1 市场部 张三 6000.00 (3 行受影响) */ --以上结果也未解决同部门同薪资的情况 --------------------------------------- --rank()用法与row_unmber()相同 --注意下面两个查询的区别 select rankId=rank()over(order by 薪资 desc),* from Test select rankId=rank()over(order by 部门 desc),* from Test /* 重点看第2个结果 rankId 部门 姓名 薪资 -------------------- ------ ------ --------------------- 1 工程部 立白 24000.00 2 策划部 李波 12000.00 3 工程部 雕牌 10000.00 4 市场部 张三 6000.00 4 市场部 李四 6000.00 6 市场部 王五 5000.00 7 工程部 赵柳 3400.00 8 策划部 海丝 2000.00 (8 行受影响) rankId 部门 姓名 薪资 -------------------- ------ ------ --------------------- 1