本文使用的測試表 與測試數據,請參考 SQL查詢案例:行列轉換html
之前寫的 行列轉換, 是 靜態直接寫 SQL 的。測試
也就是寫SQL的時候, 就會知道, 具體有哪些列須要被轉換。htm
若是要動態的處理, 也就是 列的數量, 是不肯定的。blog
那麼只能使用 存儲過程來處理了。get
注: 下面的 SQL 是在 SQL Server 2005 及以上版本可用。 (SQL Server 2000 及如下版本的, 下面的寫法不支持)it
使用 CASE WHEN 方式的動態處理.class
BEGIN -- 主 SQL. DECLARE @MainSql varchar(2000); -- 產生動態列的 SQL. DECLARE @ColumnSql varchar(1000);數據
-- 設置 產生動態列的 SQL. SET @ColumnSql = ( SELECT ', SUM(CASE WHEN place = ''' + place + ''' THEN valuw ELSE 0 END) AS ' + place FROM TestRowCol GROUP BY place FOR XML PATH('') );查詢
-- 設置主 SQL. SET @MainSql = 'SELECT name ' + @ColumnSql + ' FROM TestRowCol GROUP BY name';存儲過程
-- 執行主 SQL. EXECUTE ( @MainSql ); END GO
name 北 東 南 西 ---------- ----------- ----------- ----------- ----------- 李四 8 5 6 7 張三 4 1 2 3
使用 PIVOT 方式的動態處理.
BEGIN -- 主 SQL. DECLARE @MainSql varchar(2000); -- 產生動態列的 SQL. DECLARE @ColumnSql varchar(1000);
-- 設置 產生動態列的 SQL. SET @ColumnSql = STUFF( ( SELECT ',' + place FROM TestRowCol GROUP BY place FOR XML PATH('') ), 1, 1, '');
-- 設置主 SQL. SET @MainSql = 'SELECT * FROM TestRowCol ' + ' PIVOT( SUM(valuw) FOR place IN ( ' + @ColumnSql + ' ) ) tmp ORDER BY name';
-- 執行主 SQL. EXECUTE ( @MainSql ); END GO
name 北 東 南 西 ---------- ----------- ----------- ----------- ----------- 李四 8 5 6 7 張三 4 1 2 3
(2 行受影響)