2005的几个新函数
1
一 排序函数
2
3
row_number() +1递增返回行号
4
dense_rank() 同数量等级的数据返回相同名次,下级数量等级的排名为上级数量等级的排名+1
5
rank() 同数量等级的数据返回相同名次,下级数量等级的排名为上级所有数据总数+1
6
语法
7
function_name() OVER ( [ <partition_by_clause> ] <order_by_clause> )
8
9
10
CREATE TABLE employee (depart_name varchar(10),work_no varchar(6),salary int )
11
12
depart_name work_no salary
13
财务部 2000012000
14
财务部 2000022500
15
财务部 2000042500
16
发展部 3000022000
17
发展部 3000091800
18
发展部 3000142000
19
综合部 4000011800
20
综合部 4000052000
21
综合部 4000092500
22
技术部 5000082500
23
技术部 5000991800
24
技术部 5001022700
25
26
--按工资从低到高排名
27
SELECT row_number() OVER (ORDER BY salary ) as id,
28
dense_rank() OVER (ORDER BY salary desc) as 工资排名1,
29
rank() OVER (ORDER BY salary desc) as 工资排名2,
30
* FROM employee
31
32
ID 工资排名1 工资排名2 部门名 工号 工资
33
111发展部3000091800
34
211综合部4000011800
35
311技术部5000991800
36
424发展部3000022000
37
524综合部4000052000
38
624发展部3000142000
39
724财务部2000012000
40
838财务部2000022500
41
938财务部2000042500
42
1038综合部4000092500
43
1138技术部5000082500
44
12412技术部5001022700
45
46
--分部门按工资从低到高排名
47
SELECT row_number() OVER (PARTITION BY depart_name ORDER BY salary ) as 工资排名,
48
* FROM employee
49
50
工资排名 部门名 工号 工资
51
1 财务部2000012000
52
2 财务部2000022500
53
3 财务部2000042500
54
-------------------
55
1 发展部3000091800
56
2 发展部3000142000
57
3 发展部3000022000
58
-------------------
59
1 技术部5000991800
60
2 技术部5000082500
61
3 技术部5001022700
62
-------------------
63
1 综合部4000011800
64
2 综合部4000052000
65
3 综合部4000092500
66
67
68
69
二 行列转换
70
71
CREATE TABLE E_money (work_no varchar(6),moeny_type varchar(10),num int )
72
73
work_no money_type num
74
100001HKD 100
75
100001HKD 200
76
100001USD 300
77
200020HKD 50
78
200020RMB 5000
79
200020USD 500
80
400078HKD 80
81
400078HKD 90
82
400078RMB 800
83
400078RMB 900
84
400078USD 90
85
400078USD 800
86
87
88
--统计每个员工不同币种拥有数
89
work_no 港币 美元 人民币
90
10000130030050
91
200020505005000
92
4000781708901700
93
94
--sql 2000写法
95
select work_no,
96
sum(case when moeny_type='HKD' then num else 0 end) as 港币,
97
sum(case when moeny_type='USD' then num else 0 end) as 美元,
98
sum(case when moeny_type='RMB' then num else 0 end) as 人民币
99
from e_money
100
group by work_no
101
102
--2005新增函数
103
SELECT work_no,[HKD] as 港币,[USD] as 美元,[RMB] as 人民币 FROM e_money
104
PIVOT(
105
SUM(num)
106
FOR moeny_type IN
107
([HKD],[USD],[RMB])
108
) AS pvt
109
110
111
一 排序函数2

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

9

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

12
depart_name work_no salary13
财务部 200001200014
财务部 200002250015
财务部 200004250016
发展部 300002200017
发展部 300009180018
发展部 300014200019
综合部 400001180020
综合部 400005200021
综合部 400009250022
技术部 500008250023
技术部 500099180024
技术部 500102270025

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

32
ID 工资排名1 工资排名2 部门名 工号 工资33
111发展部300009180034
211综合部400001180035
311技术部500099180036
424发展部300002200037
524综合部400005200038
624发展部300014200039
724财务部200001200040
838财务部200002250041
938财务部200004250042
1038综合部400009250043
1138技术部500008250044
12412技术部500102270045

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

50
工资排名 部门名 工号 工资51
1 财务部200001200052
2 财务部200002250053
3 财务部200004250054
-------------------55
1 发展部300009180056
2 发展部300014200057
3 发展部300002200058
-------------------59
1 技术部500099180060
2 技术部500008250061
3 技术部500102270062
-------------------63
1 综合部400001180064
2 综合部400005200065
3 综合部400009250066

67

68

69
二 行列转换70

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

73
work_no money_type num74
100001HKD 10075
100001HKD 20076
100001USD 30077
200020HKD 5078
200020RMB 500079
200020USD 50080
400078HKD 8081
400078HKD 9082
400078RMB 80083
400078RMB 90084
400078USD 9085
400078USD 80086

87

88
--统计每个员工不同币种拥有数89
work_no 港币 美元 人民币90
1000013003005091
20002050500500092
400078170890170093

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

102
--2005新增函数103
SELECT work_no,[HKD] as 港币,[USD] as 美元,[RMB] as 人民币 FROM e_money104
PIVOT(105
SUM(num) 106
FOR moeny_type IN107
([HKD],[USD],[RMB])108
) AS pvt109

110

111


浙公网安备 33010602011771号