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


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中获取值。

TMP_RESULTS每个员工名称都有多个值。员工姓名的顺序正确,以 XML 格式发送。TEMPPARAMETERS 和 TMP_RESUTLS 具有相同的 EmployeeName 顺序。TEMPPARAMETERS 具有不同的 EmployeeNames,最初取自 XML。再次使用"Distinct",将更改添加到@COLS的EmployeeNames的顺序。现在@COLS和TMP_RESUTLS的员工姓名顺序不同。因此,使用 @COLS 作为标题和 MAX(值( 的 TMP_RESUTLS,将在列中交换结果。含义 Distinct 正在更改列的顺序,这会对数据透视表结果产生不良影响。

最新更新