【问题标题】:Dynamically change column names as week number on every weekly run在每周运行时将列名动态更改为周数
【发布时间】:2016-11-21 19:18:24
【问题描述】:

我想构建一个 SSRS 报告,其中包含周数列 - 从当前开始的 8 列共 8 周。该报告每周运行一次,然后设置当前周数。所以列名和它们的值都应该改变。是否可以在 SSRS 中构建类似的东西?

我尝试在数据集中使用基于动态 SQL 的存储过程来执行此操作。但是,对于每次运行,我什至看不到动态更新的列值

这是一个例子:

我也试图避免将这些周数作为行值,然后使用矩阵

我的存储过程看起来像这样

声明@n tinyint = datepart(wk, getdate())

声明@n1 tinyint = (@n+1), @n2 tinyint =(@n+2), @n3 tinyint =(@n+3), @n4 tinyint =(@n+4), @n5 tinyint =(@n+5), @n6 tinyint =(@n+6)

exec('选择b.sku, b.['+@n+'], b.['+@n1+'], b.['+@n2+'], b.['+@n3+'] , b.['+@n4+'], b.['+@n5+']...

将不胜感激这方面的任何帮助.. 非常感谢!

【问题讨论】:

    标签: reporting-services ssrs-2012 dynamic-sql week-number dynamic-columns


    【解决方案1】:

    使用 SSRS 时,通常最好避免使用动态 SQL 并在 SQL 中旋转数据。使用 SQL 获取您需要的原始数据,然后让 SSRS 进行透视和聚合。通过这种方式,您可以充分利用他们各自最擅长的方面。我知道您说过要避免使用矩阵,但这是使报告动态化的最佳方式。

    因此,您应该返回一个数据集中的所有数据并在矩阵上使用过滤器,或者编写两个查询并让每个查询填充一个矩阵。顺便说一句,矩阵只是一个添加了列组的表,所以不要被它们吓倒。

    【讨论】:

    • 感谢您的回复。我试图避免使用矩阵或表组的原因是在报告中我使用单个周值(例如 Field!Wk48.value)来计算其他列值。如果我将它们分组(将周数作为组项)我会能够访问个人周数据?
    • @PC-Stats 是的,请参阅Lookup 函数。 msdn.microsoft.com/en-us/library/ee210531.aspx
    • 查找函数需要一个字段名。这里字段名称是分组的。更合适的功能可能是 first , last 和 previous .. 但是根据我的经验,这些使报告非常缓慢,并且试图尽可能保持性能不变...
    【解决方案2】:

    使用标准 Tablix 有两种方法可以做到这一点。

    1. 使用 Wk 和一些日期数学的串联将列标题计算为表达式,以找到正确的周数并从查询中返回相同类型的内容(例如,列是 current_week、week_minus_1、week_minus_2...)

    2. 将列标题作为查询中的附加列返回,这些列对于每一行都是相同的值(例如 ColHeader0、ColHeader1...)。您的数据列仍将是相对周数(例如 ValueWeek0、ValueWeek1...)。在您的报告中,列标题将具有类似=First(Fields!ColHeader0.Value) 的表达式。这是一种更灵活的方法,因为如果您添加参数,它可以让您选择 8 个历史周,而不是仅选择过去 8 周。

    编辑 - 澄清

    您获得空白列 Wk48 的原因大致是您创建了报告,以寻找下次不会出现的该列。 SSRS 查找确切的列。您应该对我指定的任一选项使用相对列名:

    exec ('Select b.sku, b.['+@n+'] as Wk0, b.['+@n1+'] as Wk1, b.['+@n2+'] as Wk2, b.['+@n3+'] as Wk3, b.['+@n4+'] as Wk4, b.['+@n5+'] as Wk5...
    

    这将允许您使用适当的当前周数据填充别名 Wk0 列,并仍然确保它可以始终被 SSRS 引用为基准周。

    要更改列标题,您可以:

    1. 在列标题表达式中独立计算 SSRS 中的周数:="Wk" + CStr(<correct week calculation>)。

    2. 返回结果集中的列标题,并在列标题表达式中访问它们:

      exec ('Select b.sku, b.['+@n+'] as Wk0, b.['+@n1+'] as Wk1, b.['+@n2+'] as Wk2, b.['+@n3+'] as Wk3, b.['+@n4+'] as Wk4, b.['+@n5+'] as Wk5..., ''Wk'''+@n+' as ColHeader0, ''Wk'''+@n1+' as ColHeader1...

    并将 SSRS 列标题表达式中返回的列标题引用为=First(Fields!ColHeader0.Value)。

    【讨论】:

    • 我已经为您添加了说明。
    • 另外,您也可以这样做(相对周而不是特定周)而不使用动态 SQL。
    • 再次感谢您。 (1) 可以使用包含当前周和下周的基于参数的字段名称。一篇非常有趣的文章是:[链接] (blogs.msdn.microsoft.com/sqlforum/2011/05/03/…) 但我很难访问由这个基于表达式的查询生成的各个列。当我尝试创建表格的常用方法时,它显示没有字段
    • 在文章中注意,当他们使用动态查询时,列名保持不变。您可以发布您提出的查询/过程吗?
    【解决方案3】:

    这是一个对我有用的解决方案:

    1. 创建参数(比如 CurrWk、CurrWk1),设置为隐藏并存储“默认值”和“可用值”等于当前周数(datepart(wk, now()) 和任何后续周通过执行+1、+2、+3.. 等等。

    2. 编写查询表达式。单击数据集查询空间旁边的 fx 并为您的程序在表达式窗口中嵌入参数值编写选择查询。例如 ="Select SKU, [" & Parameter!CurrWk.Value & "] as Wk1, [" & Parameter!CurrWk.Value & "] as Wk1 from Sales_Table" 在将此查询作为“命令文本表达式”传递之前,请确保此查询在 sql ssms 中有效。

    3. 保存表达式。现在在左侧面板上找到“字段”选项卡。您需要从此处的查询中手动映射字段。如果不这样做,您很可能会看到一个空的字段列表并且根本无法访问它们。这可能是因为 ssrs 不直接从表达式存储查询元数据。

    您可以通过至少使用静态字段来避免部分问题,例如这里的 SKU 通过首先运行带有静态字段的 sql 查询(从 Sales_Table 中选择 SKU)列在“字段”列表中。然后您可以返回更新数据集 - 将查询更改为表达式并嵌入参数化字段名称。

    1. 映射字段名称。在此示例中,我选择了“查询类型”字段并将字段名称设置为 SKU、CurrentWeek、NextWeek 并分别映射到源 SKU、Wk 和 Wk1。

    点击底部的“刷新字段”。现在您有了一个包含完整字段列表的数据集。在图表、表格中使用这些。每周运行一次,并注意数字按预期变化。

    如果您在表格中使用此数据集,请确保您使用参数标签设置标题(例如,我在这里使用当前周数据为 col 设置了 =Parameters!CurrWk.Label)

    就是这样!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-04-25
      • 2022-11-03
      • 1970-01-01
      • 2021-06-25
      • 1970-01-01
      • 2014-08-27
      • 1970-01-01
      相关资源
      最近更新 更多