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 ';
答案 0 :(得分:0)
此处EmployeeName是Column,其值在“透视”时成为列标题。 @COLS
在EmployeeName
列上使用Distinct关键字,因此所选EmployeeNames
的顺序将改变。
在SQL中使用数据透视表时,它期望@COLS
(即列标题/ EmployeeName)与源表中的TMP_RESULTS
顺序相同。但是@COLS
具有EmployeeNames
的不同顺序。因此,我们在#RESULTS
表中得到了不良结果。即,列标题被交换值。
为了解决这个问题,我们可以在ID上使用Distinct和group by,或者可以删除Distinct关键字,并将来自xml路径的不同列标题添加到虚拟表中,并且由于在TMP_RESULTS
表中也将使用相同的顺序,旋转将不会交换结果。
答案 1 :(得分:0)
@COLS从TEMPPARAMETERS中获取值,而不是TMP_RESUTLS。