sql server 动态行转列
Posted mnsn
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sql server 动态行转列相关的知识,希望对你有一定的参考价值。
有时会需要sql结果集行转列的功能
sql的行转列(PIVOT)与列转行(UNPIVOT) 请参照 https://www.cnblogs.com/linJie1930906722/p/6036714.html
但是有时需要动态列 而且展示的数据部分是字符串 用上面的方法就不好使了
比如想把下面图片中 的 上半部分 行转列成 下半部分
sql 如下
但是因为是exec执行 select into 不行 insert select 做起来也比较麻烦只能用到最后的返回结果
如果并发查询不严重 可以插入一个专门存放数据的表 不是临时表 用完就删
要么就先建好临时表 拼sql动态插入列 没试过这种方式 不知道好使不
--基础数据 即需要行转列的数据 CREATE TABLE #人员答题数据 ( 人员姓名 NVARCHAR(50) NULL , 题目名称 NVARCHAR(50) NULL , 所答结果 NVARCHAR(50) NULL ) INSERT INTO #人员答题数据 ( 人员姓名 , 题目名称 , 所答结果 ) SELECT ‘张三‘ , ‘题目1‘ , ‘张三题目1答案‘ UNION SELECT ‘张三‘ , ‘题目2‘ , ‘张三题目2答案‘ UNION SELECT ‘张三‘ , ‘题目3‘ , ‘张三题目3答案‘ UNION SELECT ‘李四‘ , ‘题目1‘ , ‘李四题目1答案‘ UNION SELECT ‘李四‘ , ‘题目2‘ , ‘李四题目2答案‘ UNION SELECT ‘李四‘ , ‘题目3‘ , ‘李四题目3答案‘ SELECT * FROM #人员答题数据 ORDER BY 人员姓名,题目名称 --拼接最后的select 列数据用 如果基础数据中 的列标题是全部完整的 也可以从基础数据distinct CREATE TABLE #行数据中的需要转成列标题的数据 ( 题目名称 NVARCHAR(200) NULL ) INSERT INTO #行数据中的需要转成列标题的数据 SELECT DISTINCT 题目名称 FROM #人员答题数据 DECLARE @sql拼接最终列 NVARCHAR(MAX)= ‘‘ SET @sql拼接最终列 = ‘‘ SELECT @sql拼接最终列+= ‘ISNULL(MAX(CASE 题目名称 WHEN ‘‘‘ + 题目名称 + ‘‘‘ THEN 所答结果 END ),‘‘‘‘) AS [‘ + 题目名称 + ‘],‘ FROM #行数据中的需要转成列标题的数据 --多了一个, 去掉 IF ( @sql拼接最终列 != ‘‘ ) BEGIN SET @sql拼接最终列 = @sql拼接最终列 + ‘$‘ SET @sql拼接最终列 = REPLACE(@sql拼接最终列, ‘,$‘, ‘‘) END DECLARE @sql NVARCHAR(MAX) SET @sql = ‘SELECT 人员姓名, ‘ + @sql拼接最终列 SET @sql += ‘ FROM #人员答题数据 GROUP BY 人员姓名 ‘ EXEC(@sql) PRINT ( @sql ) DROP TABLE #人员答题数据,#行数据中的需要转成列标题的数据
以上是关于sql server 动态行转列的主要内容,如果未能解决你的问题,请参考以下文章