用PIVOT实现行转列
举个简单栗子:
SELECT TOP 50 [学生类别], [学校所在年级], count([学生id]) 总人数
FROM [OTO_学生报名表]
where [学校所在年级] LIKE '%年级%'
group by [学生类别],[学校所在年级]
order by [学生类别],[学校所在年级]
查询结果为:
但是我希望以:一年级、二年级、三年级、四年级、五年级...作为表头(字段),可以这样写:
select * from
(
SELECT TOP 50 [学生类别], [学校所在年级], count([学生id]) 总人数
FROM [OTO_学生报名表]
where [学校所在年级] LIKE '%年级%'
group by [学生类别],[学校所在年级]
order by [学生类别],[学校所在年级]
)a
PIVOT
(
sum(a.总人数) FOR
a.[学校所在年级] IN ([一年级],[二年级],[三年级],[四年级],[五年级],[六年级],[七年级],[八年级],[九年级])
)b
结果变成:
PIVOT说明:
①PIVOT函数操作的数据,就是贴着PIVOT写的那段SELECT语句里面的数据集...
②PIVOT的()括号里,包含了一个聚合函数(sum()、avg()、count()、max()、min()、等等),对应的字段就是要合并处理的字段,他将来就是新表里面的数据值;
③PIVOT的FOR...[表头的字段]...IN(....表头字段所能罗列的结果值为新的表头列....),如:一年级、二年级、三年级、四年级、五年级...这样已知的数据,作为新表表头。
从而实现行转列的转变...
再直观的说明一下,上面的PIVOT查询语句,相当于这样的SQL语句,如下:
select
[学生类别],
SUM(CASE [学校所在年级] WHEN '一年级' THEN 总人数 END) AS 一年级,
SUM(CASE [学校所在年级] WHEN '二年级' THEN 总人数 END) AS 二年级,
SUM(CASE [学校所在年级] WHEN '三年级' THEN 总人数 END) AS 三年级,
SUM(CASE [学校所在年级] WHEN '四年级' THEN 总人数 END) AS 四年级,
SUM(CASE [学校所在年级] WHEN '五年级' THEN 总人数 END) AS 五年级,
SUM(CASE [学校所在年级] WHEN '六年级' THEN 总人数 END) AS 六年级,
SUM(CASE [学校所在年级] WHEN '七年级' THEN 总人数 END) AS 七年级,
SUM(CASE [学校所在年级] WHEN '八年级' THEN 总人数 END) AS 八年级,
SUM(CASE [学校所在年级] WHEN '九年级' THEN 总人数 END) AS 九年级
from
(
SELECT TOP 50 [学生类别], [学校所在年级], count([学生id]) 总人数
FROM [OTO_学生报名表]
where [学校所在年级] LIKE '%年级%'
group by [学生类别],[学校所在年级]
order by [学生类别],[学校所在年级]
)a
group by [学生类别]
其结果也是:
由此可见,PIVOT能节约不少代码,查询结果是一样的。所以,只要理解了PIVOT,SQL语句就能变的很简洁...
PS:列转行的函数是—— UNPIVOT