SSRS:以不同颜色显示每一行并对每一列进行不同排序的报表
SSRS: Report that displays each line in a different color and sorts each column differently
我想在 SSRS 中创建一个报告。此报告最多 30 行。每条线代表不同的产品。每个产品线都有不同的颜色。所以对于产品 A,线是红色的。列中是不同年份的收入。例如,第一列是 2014 年。最后一列将显示产品的总计。现在每一列(产品名称和总和除外)都应该降序排列,每一行必须包含产品的颜色。下面是示例数据的图片。
格式化的报告应如下所示:
所以这里有一些示例数据来显示排序:
我希望这个问题是可以理解的。
首先,如何实现颜色编码?我的第一个猜测是使用代码设置颜色并使用 IIF(Fields!Product.Value = 'product A', "Yellow", "White")
。这似乎可行,但我认为将每个产品的格式硬编码到报告中是不切实际的。有没有一种优雅而动态的格式化方式?
其次,如何对每一列进行不同排序并保存与产品的关系?我是否必须为每一列创建一个 tablix 并隐藏产品名称?
我把它放在一起时没有看到最后一列,但添加起来很简单。
我创建了两个表,一个用于关联十六进制颜色的产品,另一个包含一些示例规范化数据。
终于有一个查询将它们整合在一起。我建议一旦你有了这个 运行,你就可以编辑查询以使其动态化,这样你就不需要 hard-code 值,但它应该让你了解我采用的方法。
DECLARE @prod TABLE (ProductID int, Productname varchar(50), HexColor varchar(7))
INSERT INTO @prod
VALUES
(1, 'Bikes', '#FF0000'),
(2, 'Cars', '#00FF00'),
(3, 'Vans', '#0000FF')
DECLARE @t TABLE (ProductID int, PeriodID int, Amount int)
INSERT INTO @t
VALUES
(1, 2014, 10),
(1, 2015, 12),
(1, 2016, 14),
(2, 2014, 12),
(2, 2015, 9),
(2, 2016, 8),
(3, 2014, 11),
(3, 2015, 16),
(3, 2016, 4)
SELECT ' Name' as ColName, p.ProductName, 0 as Amount, ROW_NUMBER() OVER(ORDER BY t.ProductID) AS RankID , HexColor
FROM (SELECT DISTINCT ProductID FROM @t)t
join @prod p on t.productid = p.productid
UNION ALL
SELECT '2014' as ColName, p.ProductName ,amount, ROW_NUMBER() OVER(ORDER BY Amount) AS RankID , HexColor
FROM @t t
join @prod p on t.productid = p.productid
where periodID = 2014
UNION ALL
SELECT '2015' as ColName, p.ProductName, amount, ROW_NUMBER() OVER(ORDER BY Amount) AS RankID , HexColor
FROM @t t
join @prod p on t.productid = p.productid
where periodID = 2015
UNION ALL
SELECT '2016' as ColName, p.ProductName, amount, ROW_NUMBER() OVER(ORDER BY Amount) AS RankID , HexColor
FROM @t t
join @prod p on t.productid = p.productid
where periodID = 2016
如果您将其用作 SSRS 中的数据集,那么您可以添加一个简单的矩阵,如下所示
行组在 RankID
上完成,列组在 ColName
上完成。
然后我们需要一个表达式来选择显示 Productname
或 amount
的总和。表达式看起来像这样。
=IIF(Fields!ColName.Value=" Name", Fields!ProductName.Value, Sum(Fields!Amount.Value))
最后同单元格的BackgroundColor属性也是如下表达式
=Fields!HexColor.Value
如果您愿意,可以从矩阵中删除 RankID 列(但不是组!),但为了清楚起见,我将其留在此处。最终输出如下所示。
我想在 SSRS 中创建一个报告。此报告最多 30 行。每条线代表不同的产品。每个产品线都有不同的颜色。所以对于产品 A,线是红色的。列中是不同年份的收入。例如,第一列是 2014 年。最后一列将显示产品的总计。现在每一列(产品名称和总和除外)都应该降序排列,每一行必须包含产品的颜色。下面是示例数据的图片。
格式化的报告应如下所示:
所以这里有一些示例数据来显示排序:
我希望这个问题是可以理解的。
首先,如何实现颜色编码?我的第一个猜测是使用代码设置颜色并使用 IIF(Fields!Product.Value = 'product A', "Yellow", "White")
。这似乎可行,但我认为将每个产品的格式硬编码到报告中是不切实际的。有没有一种优雅而动态的格式化方式?
其次,如何对每一列进行不同排序并保存与产品的关系?我是否必须为每一列创建一个 tablix 并隐藏产品名称?
我把它放在一起时没有看到最后一列,但添加起来很简单。
我创建了两个表,一个用于关联十六进制颜色的产品,另一个包含一些示例规范化数据。
终于有一个查询将它们整合在一起。我建议一旦你有了这个 运行,你就可以编辑查询以使其动态化,这样你就不需要 hard-code 值,但它应该让你了解我采用的方法。
DECLARE @prod TABLE (ProductID int, Productname varchar(50), HexColor varchar(7))
INSERT INTO @prod
VALUES
(1, 'Bikes', '#FF0000'),
(2, 'Cars', '#00FF00'),
(3, 'Vans', '#0000FF')
DECLARE @t TABLE (ProductID int, PeriodID int, Amount int)
INSERT INTO @t
VALUES
(1, 2014, 10),
(1, 2015, 12),
(1, 2016, 14),
(2, 2014, 12),
(2, 2015, 9),
(2, 2016, 8),
(3, 2014, 11),
(3, 2015, 16),
(3, 2016, 4)
SELECT ' Name' as ColName, p.ProductName, 0 as Amount, ROW_NUMBER() OVER(ORDER BY t.ProductID) AS RankID , HexColor
FROM (SELECT DISTINCT ProductID FROM @t)t
join @prod p on t.productid = p.productid
UNION ALL
SELECT '2014' as ColName, p.ProductName ,amount, ROW_NUMBER() OVER(ORDER BY Amount) AS RankID , HexColor
FROM @t t
join @prod p on t.productid = p.productid
where periodID = 2014
UNION ALL
SELECT '2015' as ColName, p.ProductName, amount, ROW_NUMBER() OVER(ORDER BY Amount) AS RankID , HexColor
FROM @t t
join @prod p on t.productid = p.productid
where periodID = 2015
UNION ALL
SELECT '2016' as ColName, p.ProductName, amount, ROW_NUMBER() OVER(ORDER BY Amount) AS RankID , HexColor
FROM @t t
join @prod p on t.productid = p.productid
where periodID = 2016
如果您将其用作 SSRS 中的数据集,那么您可以添加一个简单的矩阵,如下所示
行组在 RankID
上完成,列组在 ColName
上完成。
然后我们需要一个表达式来选择显示 Productname
或 amount
的总和。表达式看起来像这样。
=IIF(Fields!ColName.Value=" Name", Fields!ProductName.Value, Sum(Fields!Amount.Value))
最后同单元格的BackgroundColor属性也是如下表达式
=Fields!HexColor.Value
如果您愿意,可以从矩阵中删除 RankID 列(但不是组!),但为了清楚起见,我将其留在此处。最终输出如下所示。