SSRS 按列名排序矩阵

SSRS Sort matrix by column name

假设我有 table,在 sql 中有一些行和列。列是(id,column1,column2,column3), 我没有旋转。并在 ssrs 中获得数据集,如:Key、ColumnName、ColumnValue。我创建了如下结构的矩阵:

----------------------
Key     | ColumnName
----------------------
[Key]   | [ColumnValue]
------------------------

问题:如何在 SSRS 的矩阵中执行以下操作:“按 Column2 排序”(或按多个 column2、Column3 排序)?我需要在何处提及按特定列名排序?

我已经生成了一些测试数据,我假设您的未透视数据看起来符合这些。

在数据集查询中

如果是这样,您可以将排序列名称作为参数从 SSRS 传递进来。如果你这样做,你将不需要在你的数据集查询中声明变量,但我已经为这个例子声明并设置了它的值。

CREATE TABLE #t (KeyID int, ColName varchar(20), ColValue int)
INSERT INTO #t VALUES
(1, 'Price',        10),
(1, 'Quantity',     10),
(1, 'Value',        100),
(2, 'Price',        20),
(2, 'Quantity',     2),
(2, 'Value',        40),
(3, 'Price',        30),
(3, 'Quantity',     1),
(3, 'Value',        30)

DECLARE @SortCol varchar(20) = 'Quantity'

SELECT 
    t.*, s.SortBy
    FROM #t t
        JOIN (SELECT KeyID, SUM(ColValue) AS SortBy FROM #t WHERE ColName = @SortCol GROUP BY KeyID) s 
            ON t.KeyID = s.KeyID
    ORDER BY SortBy desc

这将为您提供以下结果。

您实际上不需要 ORDER BY 子句,因为您将在 SSRS 中对此进行排序,在 SSRS 中,您可以按 SortBy 字段对行或行组进行排序。

使用 SSRS 表达式

如果您只想使用 SSRS 表达式,则使用与上面相同的样本数据(但没有额外的排序列)...

创建一个包含 ColName 列表的新数据集(例如 dsCols),例如

SELECT DISTINCT ColName FROM #t ORDER BY ColName

创建一个名为 SortCol

的参数

在参数属性中,选择可用值“从查询中获取值”和select dsCols。将值和标签都设置为 ColName 字段。

现在,在您的矩阵中,select 行组(在我的示例中称为 KeyID

转到“排序”选项卡...

将排序表达式设置为

=SUM
   (
    IIF(Fields!ColName.Value = Parameters!SortCol.Value, 
        Fields!ColValue.Value, 
        NOTHING)
   )

根据需要设置顺序“A 到 Z”或“Z 到 A”。

现在当您 运行 报告时,您可以选择要排序的列...

可能问题不够清楚。但是在@Alan 的帮助下,我找到了适合我的完美解决方案。 因此,如果我们想要获得类似“按列 1 排序”的结果,那么在逆透视之后将您的数据集放入矩阵中。转到要按特定列排序的矩阵(在我的例子中是 column1) 行组属性---->排序---->添加--->表达式:

MAX( IIF(Fields!ColumnName.Value="Column1",Fields!ColumnValue.Value,Nothing) )

如果您还想将 Column2 添加到此矩阵进行排序,只需在同一 window 中设置第一个表达式后单击 ---> 添加---> 表达式----> 相同的查询但使用您的列名(例如 Column2)。

希望这对某些人有所帮助。