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 是一列,其值在透视时成为列标题。 @COLS
EmployeeName
列上使用 Distinct 关键字,因此所选EmployeeNames
的顺序将更改。在 SQL 中使用数据透视表时,它期望@COLS
(即列标题/员工姓名(与TMP_RESULTS
的源表中的顺序相同。但是@COLS
有不同的EmployeeNames
顺序.因此,我们在表中得到了不希望#RESULTS
结果。也就是说,列标题可以互换值。为了解决这个问题,我们可以使用 Distinct 并按 ID 分组,或者我们可以删除 Distinct 关键字并将来自 xml 路径的不同列标题添加到虚拟表中,并且由于TMP_RESULTS
表中也将使用相同的顺序,因此透视不会交换结果。
@COLS从时间参数而不是TMP_RESUTLS中获取值。