关于Sql Server的 PIVOT 行转列 的简单用法

用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

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值