标签:结果 alt bubuko sele 分享图片 weight when varchar lap
有时会需要sql结果集行转列的功能
但是有时需要动态列 而且展示的数据部分是字符串 用上面的方法就不好使了
比如想把下面图片中 的 上半部分 行转列成 下半部分
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 #人员答题数据,#行数据中的需要转成列标题的数据
标签:结果 alt bubuko sele 分享图片 weight when varchar lap
原文地址:https://www.cnblogs.com/mnsn/p/9328223.html