要想动态给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 |
|