【问题标题】:Distinct keyword used for a column, changes order of values of that column, affects Pivot table用于列的不同关键字,更改该列的值顺序,影响数据透视表
【发布时间】:2019-04-16 03:10:28
【问题描述】:
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 '; 

【问题讨论】:

  • 您必须在查询中使用ORDER BY 以获得所需的排序。
  • 请向我们展示其他相关表格的外观。你提到#RESULTSTMP_RESULTS

标签: sql-server pivot-table distinct


【解决方案1】:

这里的 EmployeeName 是当 Pivoted 时其值成为列标题的列。 @COLSEmployeeName 列上使用 Distinct 关键字,因此所选 EmployeeNames 的顺序将发生变化。 在 SQL 中使用 Pivot 表时,它期望@COLS(即,列标题/EmployeeName)与源表中的顺序相同,即TMP_RESULTS。但是@COLS 有不同的EmployeeNames 顺序。因此,我们在#RESULTS 表中得到了不想要的结果。也就是说,列标题与值互换。 为了解决这个问题,我们可以在 ID 上使用 Distinct 和 group by,或者我们可以删除 Distinct 关键字并将来自 xml 路径的不同列标题添加到虚拟表中,并且由于 TMP_RESULTS 表中也将使用相同的顺序,因此旋转不会交换结果。

【讨论】:

  • 如果这是问题的一部分,您应该将其添加到问题中。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-02-03
    • 1970-01-01
    • 1970-01-01
    • 2021-12-14
    • 1970-01-01
    • 2012-11-24
    • 2021-10-27
    • 2020-05-05
    相关资源
    最近更新 更多