Sql 动态行转列

  SELECT   ID, Name, [Month],auth
  FROM dbo.Test3

数据列表:

Sql 动态行转列_第1张图片

1.静态行专列

  Select auth, 
        MAX( CASE WHEN [Month] = '一月' then Name else null end) 一月,
        MAX( CASE WHEN [Month] = '二月' then Name else null end) 二月,
        MAX( CASE WHEN [Month] = '三月' then Name else null end) 三月,
        MAX( CASE WHEN [Month] = '四月' then Name else null end) 四月,
        MAX( CASE WHEN [Month] = '五月' then Name else null end) 五月,
        MAX( CASE WHEN [Month] = '六月' then Name else null end) 六月,
        MAX( CASE WHEN [Month] = '七月' then Name else null end) 七月,
        MAX( CASE WHEN [Month] = '八月' then Name else null end) 八月,
        MAX( CASE WHEN [Month] = '九月' then Name else null end) 九月,
        MAX( CASE WHEN [Month] = '十月' then Name else null end) 十月,
        MAX( CASE WHEN [Month] = '十一月' then Name else null end) 十一月,
        MAX( CASE WHEN [Month] = '十二月' then Name else null end) 十二月                
From dbo.Test3
Group By auth

2.利用PIVOT函数

SELECT auth, 一月, 二月, 三月, 四月 , 五月, 六月 ,七月, 八月 ,九月, 十月 ,十一月, 十二月 
     FROM (SELECT auth, [Month], Name FROM dbo.Test3) AS SourceTable  
PIVOT  
(  
  MAX(Name)  
  FOR [Month] IN (一月, 二月, 三月, 四月 , 五月, 六月 ,七月, 八月 ,九月, 十月 ,十一月, 十二月 )  
) AS PivotTable;

3.利用PIVOT,高效动态行转列 (参考上面,只要生成动态列塞进去就行了)


DECLARE @columns NVARCHAR(MAX) = '';  
  
-- 动态生成列名  
SELECT @columns +=  '' + [Month] + ','  
FROM dbo.Test3;
-- 去除最后一个逗号  
SET @columns = LEFT(@columns, LEN(@columns) - 1);   
PRINT(@columns)
  
-- 构建动态 SQL 查询  
DECLARE @sql NVARCHAR(MAX) = '  
SELECT auth, ' + @columns + '  
FROM   
(  
  SELECT auth, [Month], Name FROM dbo.Test3 
) AS SourceTable  
PIVOT  
(  
    MAX(Name)  
    FOR [Month] IN (' + @columns + ')  
) AS PivotTable;';  
  
-- 执行动态 SQL 查询
 
PRINT(@sql)  
EXECUTE(@sql);

结果:

你可能感兴趣的:(sql,数据库)