SELECT **@COLS** = STUFF((SELECT DISTINCT ',' + QUOTENAME(BR.EMPLOYEENAME) FROM **#TMP_RESULTS** BR FOR XML PATH('')),1,1,'');
SET @QUERY = 'INSERT INTO #RESULTS SELECT DISTINCT P.EMP_ID,'+**@COLS**+' FROM
(
SELECT EMP_ID,EMPLOYEENAME,OFFICE_ID,VALUE FROM **#TMP_RESULTS** BR) AS X
PIVOT
(
MAX( X.VALUE)
FOR X.EMPLOYEENAME IN (' + **@COLS** + ')
) AS P ';
这里EmployeeName是Column,其值在Pivoted时成为列标题。 @COLS
在EmployeeName
列上使用Distinct关键字,因为选择的EmployeeNames
的顺序将会改变。在SQL中使用数据透视表时,它期望@COLS
(即列标题/ EmployeeName)与TMP_RESULTS
源表中的顺序相同。但@COLS
有不同的EmployeeNames
顺序。因此,我们在#RESULTS
表中得到了不希望的结果。也就是说,列标题与值互换。要解决这个问题,我们可以在ID上使用Distinct和group by,或者我们可以删除Distinct关键字并将来自xml路径的不同列标题添加到虚拟表中,并且因为TMP_RESULTS
表中也会使用相同的顺序,所以不会旋转交换结果。
@COLS从TEMPPARAMETERS而不是TMP_RESUTLS中获取值。