【问题标题】:SRSS Conditional formatting colour with value ranges?SRSS 带有值范围的条件格式颜色?
【发布时间】:2013-04-04 01:05:37
【问题描述】:

我有一个 sql 报告服务报告,它显示我们所有商店的销售额等,它包括一个显示预算值百分比的列。我想要做的是如果值为>= .35,则使其成为单元格Green的背景,如果值为< .35 and > .30,则为Yellow,如果值为< .30 then Red

这真的让我很头疼,我似乎无法让它与所有 3 个范围一起工作。

我可以在单元格的背景颜色属性中放入表达式:

=IIF(Fields!ID__to_Budget.Value >= 0.35, "Green", "Red")

这行得通,但当然我没有任何黄色范围,任何低于 0.35 的东西都会变成红色。

我一直在尝试像这样在背景颜色上做一个嵌套表达式:

=iif( (Fields!ID__to_Budget.Value >= 0.35), "Green",
      ( iif(Fields!ID__to_Budget.Value <0.35 and > 0.30, "Yellow",
         iif(Fields!ID__to_Budget.Value < 0.30 "Red", "White") ) ) )

但它抱怨“and >0.30”部分的语法错误。

非常感谢 兰斯

【问题讨论】:

    标签: sql reporting-services


    【解决方案1】:

    你少了一个逗号。但是,嵌套的 Iif 很痛苦,所以要执行简单的函数路由,我会使用 Switch 函数来代替,所以你不必嵌套任何东西——这样更容易获得正确的语法。

    =Switch(
       Fields!ID__to_Budget.Value < 0.30, "Red",
       Fields!ID__to_Budget.Value < 0.35, "Yellow",
       Fields!ID__to_Budget.Value >= 0.35, "Green"
    )
    

    有关此功能的更多信息,请参阅Reporting Services Expression Examples

    但在我看来,编码值的“严重性”在数据库中做得更好:

    CREATE TABLE dbo.BudgetSeverity (
       FromValue decimal(20, 10) NOT NULL PRIMARY KEY CLUSTERED,
       ToValue decimal(20,10) NOT NULL,
       SeverityLevel tinyint NOT NULL
    );
    INSERT dbo.BudgetSeverity
    VALUES
       (-9999999999, 0.3, 1),
       (0, 0.35, 2),
       (0.35, 9999999999, 3)
    ;
    

    然后在你的数据集中,加入这个表。

    SELECT
       ...,
       BS.SeverityLevel
    FROM
       ...
       INNER JOIN dbo.BudgetSeverity BS
          ON B.ID__to_Budget >= BS.FromValue
          AND B.ID__to_Budget < BS.ToValue
    

    最后,在你的报告中:

    =Choose(Fields!SeverityLevel.Value, "Red", "Yellow", "Green")
    

    这样您就可以更改严重性级别,而无需部署新报告。如果您不喜欢将其放入数据库的想法,您还有其他选择。在报告的代码部分,您可以编写一个简单的函数来根据传入的值返回颜色。然后您可以使用更容易管理的 Case 语句,并且您可以在不同的字段中重用此函数,如果有变化,可以更轻松地一次更新所有这些。

    【讨论】:

    • BudgetSeverity 表中的 SeverityColour 不是比 SeverityLevel 更好吗?然后,您可以只使用 SeverityColour 字段作为您的颜色表达式。这样做的好处是,如果您想添加另一个级别,例如高于 0.45 的蓝色级别,您只需将其添加到表中,而无需编辑任何报告来更改 =Choose() 语句。 SeverityLevel 所做的只是在报告中提供颜色的计算,这似乎是一个不必要的步骤。
    • @Chris 我考虑过这一点,这是完全可行的。我刚刚决定 SeverityLevel 是数据,而 SeverityColor 是演示文稿。您的选择。
    • @ErikE 没错,我更多来自 DRY 原则。如果他们改变了对颜色的看法,比如决定他们想要橙色而不是黄色,那么在数据库中进行更改意味着更改,而使用表达式意味着更改每个报告。如果是一份报告,那两种方式都可以,如果是 100 份报告,并且您使用了一个无聊的一天的表达方式。根据需要,我可能会同时使用这两种方法,因此我可以选择“WHERE SeverityLevel = 1”加上 SeverityColour 字段,以确保报告之间的一致性,而无需重复颜色表达式。
    • @ChrisLatta 这是完全可行的,虽然我会有一个单独的报告模式来定义像颜色这样的表示形式。报告中有很多东西可以 使数据驱动:字体、字体颜色、大小、填充、粗体、斜体、下划线等等。如果您想在 100 个报告中更改这些,您会遇到类似的问题。所以这一切都取决于你认为你想把时间花在哪里,以及你认为未来可能会改变的事情。对我来说,可以肯定的是,范围的确切数值比颜色更可能发生变化。
    【解决方案2】:

    condition 和颜色 Red 的最后一个 iff clause 中没有 ,

    =iif(Fields!ID__to_Budget.Value >= 0.35, "Green",
         iif(Fields!ID__to_Budget.Value <0.35 &
              Fields!ID__to_Budget.Value> 0.30,"Yellow", 
             iif(Fields!ID__to_Budget.Value < 0.30, "Red","White") ) )
        )
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-01
      • 1970-01-01
      相关资源
      最近更新 更多