码迷,mamicode.com
首页 > 数据库 > 详细

sql server 动态行转列

时间:2018-07-18 11:54:21      阅读:176      评论:0      收藏:0      [点我收藏+]

标签:结果   alt   bubuko   sele   分享图片   weight   when   varchar   lap   

有时会需要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 #人员答题数据,#行数据中的需要转成列标题的数据
View Code

 

sql server 动态行转列

标签:结果   alt   bubuko   sele   分享图片   weight   when   varchar   lap   

原文地址:https://www.cnblogs.com/mnsn/p/9328223.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!