【问题标题】:SQL SSRS Color Code / Create a heatmap out of a tablix in SSRS (color in tablix rows based on value)SQL SSRS 颜色代码/从 SSRS 中的 tablix 创建热图(tablix 行中的颜色基于值)
【发布时间】:2019-07-12 15:31:05
【问题描述】:

所以我创建了这个看起来像这样的简单 tablix

是否有任何方法可以向此 tablix 添加表达式,以便根据基值对行进行颜色编码。

所以我设想的方式是,基值是列 Avg Value,我将设置该列的背景颜色为灰色。

然后我希望每个 Running AOV 根据其与该基值的差异进行颜色编码。例如,在该 tablix 第 5 行中,基本值为 88 美元。

那么 RunningAOV1st 是 77 美元,所以它是红色的。 RunningAOVtwo 是 84 美元,所以它会是一个非常浅的红色。接下来,RunningAOVThree 是 87 美元,所以它是更轻的红色版本。如果它是 90 美元左右,那将是一种非常浅的绿色。

这可能吗?我只是假设我需要为单元格的背景颜色添加一些表达式,但我不确定表达式会是什么。

【问题讨论】:

    标签: sql sql-server reporting-services ssrs-2008


    【解决方案1】:

    此答案与您的答案略有不同。我有一个类似的场景,并选择在 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
    

    上述基于年龄列计算的红绿蓝值,我们还添加了一个列来存储最终的十六进制值并根据函数更新该值(如下)。这个想法是HexColor 列可以直接引用为报表设计中的颜色属性。

    以下是将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
    

    【讨论】:

      【解决方案2】:

      您可以右键单击该数据的文本框并打开属性。然后在“填充”选项卡上单击“fx”并打开“表达式”框。然后根据 IIF 语句为您希望的值设置背景颜色。

      【讨论】:

      • 我了解如何设置背景颜色,但我不知道我会使用哪个表达式使颜色基于渐变上的值减去另一个值。
      • 在 IIF 语句的第一部分,您进行计算。然后根据结果设置颜色。 =IIF(Value1 - Value 2 = SetValue, "RED", "Blue")
      【解决方案3】:

      我建议有一个表格来根据最小值和最大值定义颜色编码。 创建了一个临时表来展示它是如何完成的,我没有得到你拥有的所有组合,但是使用了一个示例数据集

      使用的 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
      

      这将为输出提供您想要的颜色

      输入数据集是

      输出看起来像这样

      如果您有一张实体桌子,您可以灵活地使用桌子改变颜色。

      设计窗口

      在颜色值上添加背景表达式

      【讨论】:

        【解决方案4】:

        因此,根据您可以用来执行此操作的实际表达式,我在这里看不到任何答案。我会提前说,这会有些复杂,并且可能需要在您的端进行一些调整才能使值正确。您将需要使用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(....))`
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-11-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-06-05
          • 1970-01-01
          相关资源
          最近更新 更多