[英]SQL SSRS Color Code / Create a heatmap out of a tablix in SSRS (color in tablix rows based on value)
所以我创建了一个看起来像这样的简单tablix
有什么方法可以向此Tablix添加表达式,以便基于基值对行进行颜色编码。
因此,我设想的方式是,基本值是列“平均值”,我将设置该列的背景色为灰色。
然后,我希望每个正在运行的AOV根据与该基本值的差异进行颜色编码。 因此,例如,在该Tablix行5中,基值为$ 88。
那么RunningAOV1st是$ 77,所以它将是红色。 RunningAOVTwo是$ 84,所以它会是非常浅的红色。 接下来,RunningAOVThree的价格为87美元,因此它的红色版本更轻。 如果价格是90美元,那将是非常浅的绿色阴影。
这可能吗? 我只是假设需要为单元格的背景色添加一些表达式,但是我不确定该表达式是什么。
这个答案与您的答案略有不同。 我有一个类似的情况,选择在SQL中进行颜色计算。 我认为这样做比较容易,尽管我认为您可以很轻松地将其转换为报表中的自定义代码功能。
这是报告中的数据集示例,该报告根据某些数据的使用期限对单元格进行了着色。 这个年龄已经被人们预知了,所以这里引用的AGe栏只是一个数字。 如果年龄超过90天,它将始终显示为纯红色。
数据集查询的一部分
SELECT
lp.*
, 255 as Red-- Red: always 255
, 255 - (Age/3) AS Green -- Green: gives range from 255 - 225 for 0 to 90 days. Anything over 90 will be set to 255 in next statement
, 254 - (Age * (254/90)) AS Blue -- Blue: Give range of 254 - 0 for 0 to 90 days
, cast(NULL as varchar (7)) AS HexColour
INTO #t
FROM #d lp
JOIN Dim.Geography g ON lp.CountryID = g.CountryID
UPDATE #t SET HexColour = [fn].[ConvertRGBValuesToHexColour] (Red, CASE WHEN Green <225 THEN 225 ELSE Green END , Blue)
SELECT * FROM #t
上面根据age列计算出的红色,绿色和蓝色值,我们还添加了一个列来存储最终的十六进制值,并根据函数(如下)对其进行更新。 这个想法是可以在报表设计中直接将HexColor
列作为color属性引用。
以下是将RGB值转换为十六进制值以供报告使用的函数。
CREATE FUNCTION [fn].[ConvertRGBValuesToHexColour] (@R int, @G int, @B int)
RETURNS varchar(7)
AS
BEGIN
RETURN '#' + RIGHT(CONVERT(VARCHAR(11), CONVERT(BINARY(1),@R,0) + CONVERT(BINARY(1),@G,0) +CONVERT(BINARY(1),@B,0) , 1),6)
END
我建议有一个表格来定义基于最小值和最大值的颜色编码。 创建了一个临时表来显示它是如何完成的,我没有获得所有的组合,但是使用了一个样本数据集
使用SQL
select * INTO #Data
from (
Select 1 AS Counts,75 AS Value,'Total Orders' AS Category UNION ALL
Select 1 AS Counts,250 AS Value,'Avg Orders' AS Category UNION ALL
Select 1 AS Counts,10 AS Value,'Avg Value' AS Category UNION ALL
Select 1 AS Counts,13 AS Value,'Running 1st' AS Category UNION ALL
Select 1 AS Counts,'' AS Value,'Running 2nd' AS Category UNION ALL
Select 1 AS Counts,'' AS Value,'Running 3rd' AS Category UNION ALL
Select 2 AS Counts,23 AS Value,'Total Orders' AS Category UNION ALL
Select 2 AS Counts,46 AS Value,'Avg Orders' AS Category UNION ALL
Select 2 AS Counts,30 AS Value,'Avg Value' AS Category UNION ALL
Select 2 AS Counts,34 AS Value,'Running 1st' AS Category UNION ALL
Select 2 AS Counts,'' AS Value,'Running 2nd' AS Category UNION ALL
Select 2 AS Counts,'' AS Value,'Running 3rd' AS Category UNION ALL
Select 3 AS Counts,'' AS Value,'Total Orders' AS Category UNION ALL
Select 3 AS Counts,23 AS Value,'Avg Orders' AS Category UNION ALL
Select 3 AS Counts,55 AS Value,'Avg Value' AS Category UNION ALL
Select 3 AS Counts,67 AS Value,'Running 1st' AS Category UNION ALL
Select 3 AS Counts,77 AS Value,'Running 2nd' AS Category UNION ALL
Select 3 AS Counts,'' AS Value,'Running 3rd' AS Category ) a
select * INTO #Colors
from (
select 'Green' color, 1 min_value , 50 max_value UNION ALL
select 'Yellow' color, 51 min_value , 100 max_value UNION ALL
select 'Red' color, 101 min_value , 1000 max_value
) b
select a.Category, a.Counts, a.Value, b.color
from #Data a
left join #Colors b
on a.Value between b.min_value and b.max_value
drop table #Colors
drop table #Data
这将为输出提供您想要的颜色
输入数据集为
输出看起来像这样
如果您有物理表,则可以灵活地使用表更改颜色。
设计窗口
在颜色值上添加了背景表达式
因此,根据可用于执行此操作的实际表达式,我在此处看不到任何答案。 我先要说,这将有些复杂,可能需要对端进行一些调整才能使值正确。 您将希望使用SWITCH
使其尽可能简单,并只需为每种颜色指定所需的范围。 假设所有AOVRunning
值均从数据库的同一列中填充,则以下表达式应在背景色属性中起作用。
=SWITCH(Fields!AOV.Value > (Fields!Avg.Value + 10), "Green",
Fields!AOV.Value >= (Fields!Avg.Value + 5) AND Fields!AOV.Value <= (Fields!Avg.Value + 10), "LightGreen",
Fields!AOV.Value = Fields!Avg.Value, "Yellow",
Fields!AOV.Value <= (Fields!Avg.Value - 5) AND Fields!AOV.Value >= (Fields!Avg.Value -10), "LightRed",
Fields!AOV.Value < (Fields!Avg.Value - 10), "Red",
true, "White")
这只是将每个AOV值与平均值以及与该平均值关联的范围进行比较。 显然,您可以根据选择的跨度向其中添加尽可能多的颜色-这只是一个示例。 最终的true, "White"
仅捕获不满足任何其他条件比较的所有剩菜。 您也可以在SWITCH
外部添加一个IIF
以消除这些结果,然后再进入SWITCH
...
=IIF(Fields!AOV.Value Is Nothing, "White", SWITCH(....))`
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.