應用stuff,for xml path,pivot等實現sqlserver行列轉換
阿新 • • 發佈:2021-01-25
技術標籤:sqlserver
原始資料如下圖:
想得到的資料:
測試資料:
CREATETABLE#T
(CLASS VARCHAR(10),
NAME VARCHAR(20),
GRADE VARCHAR(10))
INSERT INTO #T
SELECT '1','TOM','A' UNION ALL
SELECT '1','JACK','A' UNION ALL
SELECT '1','JERRY','B' UNION ALL
SELECT '1','JANE','A' UNION ALL
SELECT '2','ROSE','C' UNION ALL
SELECT '2','FRANK','C' UNION ALL
SELECT '3','JERRY','Q' UNION ALL
SELECT '3','ZOE','C' UNION ALL
SELECT'3','HENRY','A'
靜態語句實現:
SELECT*
FROM #T
PIVOT (COUNT(NAME) FOR GRADE IN ([A],[B],[C],[Q])) B
效果如下:
如果等次不是固定的,而是動態的,可以通過動態sql語句實現:
declare @sql varchar(max)
set @sql='' --初始化變數@sql
select @[email protected]+','+grade from #T group by GRADE --變數多值賦值
set @sql=stuff(@sql,1,1,'') --去掉首個‘,‘
set @sql='SELECT * FROM #T PIVOT (COUNT(NAME) FOR GRADE IN ('[email protected]+'))B'
exec(@sql)
說明:
stuff(param1, startIndex, length, param2)
將param1中自startIndex(SQL中都是從1開始,而非0)起,刪除length個字元,然後用param2替換刪掉的字元。
FOR XML PATH 可以將查詢結果根據行輸出成XML各式(暫時未用)
EXEC命令執行一個動態的批處理,可以用於執行儲存過程。