sqlserver 的pivot和unpivot用法

近些天在学习SQLserver,过程中遇到了一些自己不知道东西,就随手记下来,以便以后忘了,还得再重新查,
今天说的是SQLserver的pivot(行转列)和unpivot(列转行),废话不多说先来看一下语法,
首先为了找到合适的场景,我随机写了一个SQL,代码如下

SELECT 
business_type, 
COUNT(business_type)
FROM dbo.pd_product
GROUP BY business_type

得到的结果如图,
在这里插入图片描述
就是一个简单地聚合运算,大家都会,下面我要在这个基础上写SQL行转列,就是将business_type这列的值转为列名,代码如下
pivot(行转列)

SELECT pi.* FROM (
	SELECT 
		business_type, 
		COUNT(business_type) AS b
		FROM dbo.pd_product
		GROUP BY business_type
) p
PIVOT (
	sum(b)
	FOR business_type IN([doctor],[pni],[goods],[play],[mtt],[diet],[hotel],[site],[feeding],[tcm],[activity],[examination],[visit])
)pi

结果如图
在这里插入图片描述
pivot里面需要跟一个聚合函数,其次for后面是要行转列的行所对应的列名,in里面跟的是对应的行值,如果你写一个不存在的行值查询出来那一列就是null,温馨提示:SQL的[]这个中括号不能省哦
下面介绍unpivot(列转行)的语法,同样我是在之前的SQL上写的,这个需要你自己定义两列,因为我要将上图的结果还原回去,

SELECT type,num FROM (
		SELECT pi.* FROM (
	SELECT 
		business_type, 
		COUNT(business_type) AS b
		FROM dbo.pd_product
		GROUP BY business_type
) p
PIVOT (
	sum(b)
	FOR business_type IN([doctor],[pni],[goods],[play],[mtt],[diet],[hotel],[site],[feeding],[tcm],[activity],[examination],[visit])
)pi
) up
UNPIVOT(
	num FOR type IN (doctor,pni,goods,play,mtt,diet,hotel,site,feeding,tcm,activity,examination,visit)
)unp

结果如图
在这里插入图片描述
看到这里也许大家会说我是不是傻,直接groupby多简单,我只是为了更加明了的让大家看清楚如何使用的,网上说这两个不能来回转,但是我这里至少实现了,虽然有些二,
网上还有说pivot的值可以动态写,我没有测试,留给你们了,pivot的用法其实跟groupby一样,unpivot跟union all的用法一样,大家都可以试一下,
最后一条:pivot的性能很差,不建议使用,我没测试,希望哪位大神有时间可以试一下

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值