分享

SQL Server:pivot函数动态行转列!

 hncdman 2022-11-01 发布于湖南

要想动态给in()里赋值就先要明白不需要动态怎样赋值,先看一下之前写的。

先来看看不需要动态行转列的https://blog.csdn.net/weixin_46348403/article/details/120522341

https://blog.csdn.net/weixin_46348403/article/details/120522341

动态赋值的话就要先定义一个变量接收查出的数据,且要把查出的数据转成in()认识的格式,

多看几遍就会明白!

定义了两个变量,再分别赋值一个接收需要转列的数据,一个接收要执行的sql。

declare  @name nvarchar(2000),  --先声明俩变量。存姓名列的值,这里要转姓名列

 @strSql nvarchar(1000)  ----存将要执行的sql

--set赋值

SET @name=''

--赋值 把所有要转化为列的数据保存在字符串中,并且以逗号分隔,CDate随便起的名字。

--'['+subject+'],'用来给查出的每一条数据都加上[]

 select  @name=@name+CDate  from (select  distinct '['+subject+'],' AS CDate FROM testtable) AS T1

 --去掉末尾的一个逗号,in()中放的格式是[值1],[值2],[值...]

 SET @name=SUBSTRING(@name,1,LEN(@name)-1)

--可以先打印一下看看是否数据格式都正确

print @name

--存放将要执行的sql,将@name赋给in()里

SET  @strSql ='select b.Name 姓名,count(b.语文) 语文,count(b.数学) 数学,count(b.英语)  英语

from testtable 

pivot(

sum(Num) 

for subject 

in ('+@Name+')

)  

as b 

group by b.Name'

--打印最终执行的SQL

 PRINT(@strSql)

 --执行sql

 EXEC (@strSql)

这里有个严重BUG 

这些列也得动态起来,解决起来也挺简单。

declare  @name nvarchar(2000),

@name1 nvarchar(2000),

 @strSql nvarchar(2000)

SET @name=''

 --赋值 把所有要转化为列的数据保存在字符串中,并且以逗号分隔

 select  @name=@name+CDate  from (select  distinct '['+subject+'],' AS CDate FROM testtable) AS T1

SET @name1=''

 select  @name1=@name1+CDate  from (select  distinct 'count('+subject+') as '+subject+',' AS CDate FROM testtable) AS T2

 SET @name1=SUBSTRING(@name1,1,LEN(@name1)-1)

 --去掉末尾的一个逗号

 SET @name=SUBSTRING(@name,1,LEN(@name)-1)

  PRINT(@name)

   PRINT(@name1)

SET  @strSql ='select b.name as 姓名,'+@name1+'

from testtable 

pivot(

sum(Num) 

for subject 

in ('+@Name+')

)  

as b

group by b.name'

--打印最终执行的SQL

 PRINT(@strSql)

 --执行sql

 EXEC (@strSql)

 有疑问就下方评论。

————————————————

版权声明:本文为CSDN博主「码农周末Moo」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/weixin_46348403/article/details/120527757

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多