應用stuff,for xml path,pivot等實現sqlserver行列轉換
阿新 • 來源:網路 • 發佈:2021-01-25
技術標籤:sqlserver
原始資料如下圖:

想得到的資料:

測試資料:
CREATETABLE#T(CLASS VARCHAR(10),NAME VARCHAR(20),GRADE VARCHAR(10))INSERT INTO #TSELECT '1','TOM','A' UNION ALLSELECT '1','JACK','A' UNION ALLSELECT '1','JERRY','B' UNION ALLSELECT '1','JANE','A' UNION ALLSELECT '2','ROSE','C' UNION ALLSELECT '2','FRANK','C' UNION ALLSELECT '3','JERRY','Q' UNION ALLSELECT '3','ZOE','C' UNION ALLSELECT'3','HENRY','A'
靜態語句實現:
SELECT*FROM #TPIVOT (COUNT(NAME) FOR GRADE IN ([A],[B],[C],[Q])) B
效果如下:

如果等次不是固定的,而是動態的,可以通過動態sql語句實現:
declare @sql varchar(max)set @sql='' --初始化變數@sqlselect @[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命令執行一個動態的批處理,可以用於執行儲存過程。
