如何在动态数据透视中先按行排序,然后按列排序

Posted

技术标签:

【中文标题】如何在动态数据透视中先按行排序,然后按列排序【英文标题】:How to order by rows, then columns, in dynamic pivot 【发布时间】:2019-04-23 20:20:59 【问题描述】:

我创建了一个包含所有我想要的数据的临时表。然后,我使用动态透视提取数据并试图弄清楚如何按行排序,然后是透视列。我有行排序,但不知道如何对透视列进行排序。

SET @COLS = N'';
SET @COLS2 = N'';

SELECT @COLS += N', ISNULL(' + QUOTENAME(PivotedName) + ',0) AS ' + QUOTENAME(PivotedName), @COLS2 += N', ' + QUOTENAME(PivotedName)
FROM    (SELECT DISTINCT(PivotedName) FROM #TEMP1 T1) AS X;

SET @SQL = N'
SELECT [ID#],[Name],' + STUFF( @COLS, 1, 2, '') + '
FROM        
(
    SELECT T1.[ID#], T1.[Name], T1.PivotedName, T1.PivotedAggregate FROM #TEMP1 T1 

) AS C
PIVOT 
(
    MAX(PivotedAggregate) FOR PivotedName IN (' + STUFF(REPLACE(@COLS2, ', [', ',['), 1, 1, '') + ')
) AS P

ORDER BY [ID#] DESC
;';


EXECUTE SP_EXECUTESQL @SQL;

结果像这样返回,它们按我想要的 ID# DESC 排序。但其次,我希望它们按“PivotName”而不是按字母顺序排序,实际上是按#TEMP1 中可用的另一列“SortOrder”。

实际结果:

ID# Name    PivotName1  PivotName4  PivotName3  PivotName2
10  Jon     10          0.91            9           0.91
9   Jane    8           15.8            14          0.8
8   Tom     6           0.84            6           0.84
7   Steve   3.37        0.85            37.5        0.99
6   Bob     0.75        0.73            0.75        0.73

期望的结果:

ID# Name    PivotName1  PivotName2  PivotName3  PivotName4
10  Jon     10          0.91        9           0.91
9   Jane    8           0.8         14          15.8

【问题讨论】:

看来您只需要在您的SELECT @COLS....声明中添加一个ORDER BY即可 你介意给我举个例子吗?我尝试过的所有错误。我阅读了一些建议,它必须包含我知之甚少的 XML。 【参考方案1】:

正如我所说,您需要添加一个ORDER BY。只需更改:

SELECT @COLS += N', ISNULL(' + QUOTENAME(PivotedName) + ',0) AS ' + QUOTENAME(PivotedName), @COLS2 += N', ' + QUOTENAME(PivotedName)
FROM    (SELECT DISTINCT(PivotedName) FROM #TEMP1 T1) AS X;

SELECT @COLS += N', ISNULL(' + QUOTENAME(PivotedName) + ',0) AS ' + QUOTENAME(PivotedName), @COLS2 += N', ' + QUOTENAME(PivotedName)
FROM    (SELECT DISTINCT(PivotedName) FROM #TEMP1 T1) AS X ORDER BY PivotedName;

【讨论】:

谢谢你。我可以看到我不够清楚。我不想按 PivotedName 排序,我想按 #TEMP1 中实际上不需要在数据中返回的其他字段进行排序。 您不能按数据集中不存在的列对数据进行排序 @userKW 。【参考方案2】:

SELECT @COLS += N', ISNULL(' + QUOTENAME(PivotedName) + ',0) AS ' + QUOTENAME(PivotedName), @COLS2 += N', ' + QUOTENAME(PivotedName)
FROM    (SELECT DISTINCT(PivotedName), SortOrder FROM #TEMP1 T1) AS X ORDER BY SortOrder;

想通了。我从临时表中提取排序顺序进行排序,但没有在我的最终 sql 中使用它。感谢您的讨论。

【讨论】:

以上是关于如何在动态数据透视中先按行排序,然后按列排序的主要内容,如果未能解决你的问题,请参考以下文章

对矩阵按行和按列进行排序

Pandas:排序数据透视表

DS&ML_用Excel实现按行排序后按列排序,最后高亮重复值

DS&ML_用Excel实现按行排序后按列排序,最后高亮重复值

Pandas pivot_table,按列对值进行排序

首先按行然后按列填充 GridLayoutManager