应用stuff,for xml path,pivot等实现sqlserver行列转换
原始数据如下图:
想得到的数据:
测试数据:
CREATE TABLE #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 @sql=@sql+','+grade from #T group by GRADE --变量多值赋值set @sql=stuff(@sql,1,1,'') --去掉首个‘,‘set @sql='SELECT * FROM #T PIVOT (COUNT(NAME) FOR GRADE IN ('+@sql+'))B'exec(@sql)
说明:
stuff(param1, startIndex, length, param2)
将param1中自startIndex(SQL中都是从1开始,而非0)起,删除length个字符,然后用param2替换删掉的字符。
FOR XML PATH 可以将查询结果根据行输出成XML各式(暂时未用)
EXEC命令执行一个动态的批处理,可以用于执行存储过程。
