访问组中的文本框

时间:2018-11-05 23:58:03

标签: reporting-services

我知道必须先问这个问题,但是我缺乏词汇表甚至无法查询。如果有人可以引导我朝着正确的方向前进,那将不胜感激。

我有一个相对简单的SSRS矩阵。

我将返回十年的数据,按行组中的位置分组,按列组中的年份分组

-----------------------
|      |      |  YEAR |
-----------------------
| TYPE | NAME |  Count|  <<==  ReportItems!Textbox1
-----------------------

这将是提供报告的示例数据:

------------------------------
|Type|Name    |Year   |Count |
------------------------------
| 1  |Bob's   |2007   |4126  |
-----------------------------|
| 1  |Bob's   |2008   |4031  |
-----------------------------|
| 1  |Bob's   |2009   |4268  |
-----------------------------|
| 1  |Bob's   |2010   |4504  |
-----------------------------|
| 1  |Bob's   |2011   |4605  |
-----------------------------|
| 1  |Bob's   |2012   |4888  |
-----------------------------|
| 1  |Bob's   |2013   |4761  |
-----------------------------|
| 1  |Bob's   |2014   |4689  |
-----------------------------|
| 1  |Bob's   |2015   |4573  |
-----------------------------|
| 1  |Bob's   |2016   |4388  |
-----------------------------|
| 1  |Bob's   |2017   |4702  |
------------------------------

结果与此类似:

------------------------------------------------------------------------------------------- 
|    |       | 2007 | 2008 | 2009 | 2010 | 2011 | 2012 | 2013 | 2014 | 2015 | 2016 | 2017 | 1 year change| 3 year change| 5 year change| 10 year change|
------------------------------------------------------------------------------------------- 
| 1  | Bob's | 4126 | 4031 | 4268 | 4504 | 4605 | 4888 | 4761 | 4689 | 4573 | 4388 | 4702 |          -5% |        + 3 % |          + 5%|         + 9%  |
------------------------------------------------------------------------------------------- 
| 1  | Jim's | 5156 | 5031 | 5568 | 5505 | 5605 | 5888 | 5761 | 5689 | 5573 | 5388 | 5705 |  bla-bla-bla |  bla-bla-bla |  bla-bla-bla |  bla-bla-bla  |
------------------------------------------------------------------------------------------- 
| 2  | Sam's | 3126 | 3031 | 3268 | 3503 | 3605 | 3888 | 3761 | 3689 | 3573 | 3388 | 3702 |  bla-bla-bla |  bla-bla-bla |  bla-bla-bla |  bla-bla-bla  |
-------------------------------------------------------------------------------------------

如何引用特定年份的数据单元?
完成后,即可执行计算。

感谢您抽出宝贵时间来回复。

2 个答案:

答案 0 :(得分:2)

首先,不必担心答案的长度!,我只是倾向于添加很多解释,该过程非常简单...

因此,我创建了一个与您的示例类似的数据集。我的样本数据仅上至2016年,因此样本报告仅适用于2006-2016年。我的样本数据也基于国家/地区。

以下查询将生成您想要的数据,我将在下面说明。

SELECT 
       v.*
       , ([Count] - LAG([Count]) OVER(PARTITION By [Location] ORDER BY [Year]))/ LAG([Count]) OVER(PARTITION By [Location] ORDER BY [Year]) as Chg1
       , ([Count] - LAG([Count], 3) OVER(PARTITION By [Location] ORDER BY [Year]))/ LAG([Count], 3) OVER(PARTITION By [Location] ORDER BY [Year]) as Chg3
       , ([Count] - LAG([Count], 5) OVER(PARTITION By [Location] ORDER BY [Year]))/ LAG([Count], 5) OVER(PARTITION By [Location] ORDER BY [Year]) as Chg5
       , ([Count] - LAG([Count], 10) OVER(PARTITION By [Location] ORDER BY [Year]))/ LAG([Count], 10) OVER(PARTITION By [Location] ORDER BY [Year]) as Chg10
    FROM (
          SELECT [Location], [Year] , SUM([Count]) AS [Count]
             FROM soSampleData d
             WHERE [Year] BETWEEN 2006 and 2016
             GROUP BY [Location], [Year]
       ) v

因此,子查询(v)仅按位置和年份对数据进行分组。如果您的基本数据已经是这样,则可以将整个子查询替换为FROM myTableName v

在SELECT中,我们从v中获取所有列以及百分比变化值。以chg3为例,此行显示为..

([[Count]-[3年前的计数])/ [3年前的计数])为Chg3,显然可以进行更改以满足您的计算要求! :)

[3年前的计数是通过使用LAG函数实现的。 LAG([Count], 3) OVER(PARTITION By [Location] ORDER BY [Year])表示按[年份]排序时从[位置]的前第三行获得[计数]列。因此,对于2015年的阿根廷来说,这将是2012年的阿根廷。

我建议您先在SSMS中对此进行测试,然后再将其用于报告中,以确保获得正确的结果。

报告

创建一个新报告,使用上面的查询添加一个新的数据集。我在这里使用默认名称“ DataSet1”。

添加一个矩阵,将行组设置为[Location],将列组设置为[Year],并将数据单元格设置为[Count]。

接下来将Chg1到chg10字段拖动到数据单元格的右侧,这将在组内添加新列。

设计应该看起来像这样... enter image description here

接下来,我们要隐藏%chg列,除非它是列组的最后一个实例(在我的情况下为2016,在您的情况下为2017)

接下来,对于4个%change列中的每一个,右键单击灰色列标题,选择“列可见性”并将表达式设置为

=Fields![Year].Value <> MAX(Fields![Year].Value, "DataSet1")

当[Year]与整个名为“ DataSet1”的数据集中的最大[year]不同时,这基本上将'hidden'属性设置为True。 请注意,这是区分大小写的

运行报告时,我们得到以下输出。 (我添加了一些单元格格式来进行清理,[count]单元格设置为“ n0”,百分比单元格格式设置为“ p1”)

enter image description here

希望它足够接近您想要的东西。

答案 1 :(得分:0)

通常,您使用表达式ReportItems!Textbox0.Value(文本框1上方的文本框)进行引用,但是在您的情况下,您无法引用特定的年份,因为它以矩阵形式存在,例如,所有年份都在ReportItems!Textbox0.Value中。但是您可以做的是对其进行过滤。像这样:

=IIF(ReportItems!Textbox0.Value = "2017", Avg(Fields!Another.Value), Nothing)

与之相同(应用于执行计算):

=IIF(Fields!YourYear.Value = "2017", Avg(Fields!Another.Value), Nothing)