用于列的唯一关键字,更改该列的值顺序,影响数据透视表

时间:2019-04-16 03:10:29

标签: sql-server pivot-table distinct

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 '; 

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

@COLS从TEMPPARAMETERS中获取值,而不是TMP_RESUTLS。

TMP_RESULTS具有每个EmployeeName的多个值。 EmployeeNames的顺序正确,以XML发送。 TEMPPARAMETERS和TMP_RESUTLS都具有相同的EmployeeNames顺序。 TEMPPARAMETERS具有最初取自XML的不同EmployeeName。再次使用'Distinct',将更改添加到@COLS的EmployeeNames的顺序。现在,@ COLS和TMP_RESUTLS的EmployeeNames订单不同。因此,使用@COLS作为标题和TMP_RESUTLS的MAX(Values)将互换列中的结果。 含义不同正在更改列的顺序,这对数据透视表的结果有不利影响。