SELECT ID, Name, [Month],auth
FROM dbo.Test3
数据列表:
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);
结果: