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

 

以上是关于sql server 动态行转列的主要内容,如果未能解决你的问题,请参考以下文章

SQL server 动态行转列

sql server 动态行转列

sql server 动态参数化 行转列

SQL Server 动态行转列(参数化表名分组列行转列字段字段值)

SQL Server中Pivot()函数实现动态行转列

通过sql实现动态行转列