SQL2005的几个新函数

一 排序函数 

row_number() +1递增返回行号 
dense_rank() 同数量等级的数据返回相同名次,下级数量等级的排名为上级数量等级的排名+1 
rank() 同数量等级的数据返回相同名次,下级数量等级的排名为上级所有数据总数+1 
语法 
function_name() OVER ( [ <partition_by_clause> ] <order_by_clause> ) 


CREATE TABLE employee (depart_name varchar(10),work_no varchar(6),salary int ) 

depart_name work_no salary 
财务部 200001 2000 
财务部 200002 2500 
财务部 200004 2500 
发展部 300002 2000 
发展部 300009 1800 
发展部 300014 2000 
综合部 400001 1800 
综合部 400005 2000 
综合部 400009 2500 
技术部 500008 2500 
技术部 500099 1800 
技术部 500102 2700 

--按工资从低到高排名 
SELECT row_number() OVER (ORDER BY salary ) as id, 
dense_rank() OVER (ORDER BY salary desc) as 工资排名1, 
rank() OVER (ORDER BY salary desc) as 工资排名2, 
* FROM employee 

ID 工资排名1 工资排名2 部门名 工号 工资 
1 1 1 发展部 300009 1800 
2 1 1 综合部 400001 1800 
3 1 1 技术部 500099 1800 
4 2 4 发展部 300002 2000 
5 2 4 综合部 400005 2000 
6 2 4 发展部 300014 2000 
7 2 4 财务部 200001 2000 
8 3 8 财务部 200002 2500 
9 3 8 财务部 200004 2500 
10 3 8 综合部 400009 2500 
11 3 8 技术部 500008 2500 
12 4 12 技术部 500102 2700 

--分部门按工资从低到高排名 
SELECT row_number() OVER (PARTITION BY depart_name ORDER BY salary ) as 工资排名, 
* FROM employee 

工资排名 部门名 工号 工资 
1 财务部 200001 2000 
2 财务部 200002 2500 
3 财务部 200004 2500 
------------------- 
1 发展部 300009 1800 
2 发展部 300014 2000 
3 发展部 300002 2000 
------------------- 
1 技术部 500099 1800 
2 技术部 500008 2500 
3 技术部 500102 2700 
------------------- 
1 综合部 400001 1800 
2 综合部 400005 2000 
3 综合部 400009 2500 



二 行列转换 

CREATE TABLE E_money (work_no varchar(6),moeny_type varchar(10),num int ) 

work_no money_type num 
100001 HKD 100 
100001 HKD 200 
100001 USD 300 
200020 HKD 50 
200020 RMB 5000 
200020 USD 500 
400078 HKD 80 
400078 HKD 90 
400078 RMB 800 
400078 RMB 900 
400078 USD 90 
400078 USD 800 


--统计每个员工不同币种拥有数 
work_no 港币 美元 人民币 
100001 300 300 50 
200020 50 500 5000 
400078 170 890 1700 

--sql 2000写法 
select work_no, 
sum(case when moeny_type='HKD' then num else 0 end) as 港币, 
sum(case when moeny_type='USD' then num else 0 end) as 美元, 
sum(case when moeny_type='RMB' then num else 0 end) as 人民币 
from e_money 
group by work_no 

--2005新增函数 
SELECT work_no,[HKD] as 港币,[USD] as 美元,[RMB] as 人民币 FROM e_money 
PIVOT( 
SUM(num) 
FOR moeny_type IN 
([HKD],[USD],[RMB]) 
) AS pvt  

--ROW_NUMBER生成自增字段
SELECT ROW_NUMBER()OVER(ORDER BY EmployeeID) AS LineID,EmployeeID,EmployeeName
FROM BEmployee

--建立测试数据
DECLARE @t TABLE(stID INT,stName NVARCHAR(10),QTY INT)
INSERT INTO @t(stID,stName,QTY)
SELECT 1,N'aa',50 UNION ALL
SELECT 2,N'bb',60 UNION ALL
SELECT 3,N'bb',40 UNION ALL
SELECT 4,N'dd',75 UNION ALL
SELECT 5,N'aa',500 UNION ALL
SELECT 6,N'ff',520 UNION ALL
SELECT 7,N'gg',150 

--DENSE_RANK显示排名
SELECT DENSE_RANK() OVER(ORDER BY QTY DESC)AS LineID,stName,QTY
FROM @t

--RANK函数,显示排名与序列
SELECT RANK() OVER(ORDER BY QTY DESC)AS RankID,stID,stName,QTY
FROM @t

--NTILE分页排序
SELECT NTILE(4) OVER(ORDER BY QTY DESC)AS RankID,stID,stName,QTY
FROM @t

--同字段最小值筛选
SELECT ROW_NUMBER() OVER (ORDER BY stName ASC)as LineID,* 
FROM @T a 
WHERE NOT EXISTS(SELECT 1 FROM @t WHERE stName=a.stName AND QTY

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值