SQL查詢案例:動態行列轉換處理

 

本文使用的測試表 與測試數據,請參考  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 行受影響)

相關文章
相關標籤/搜索