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)。
希望这对某些人有所帮助。
假设我有 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)。
希望这对某些人有所帮助。