我知道必须先问这个问题,但是我缺乏词汇表甚至无法查询。如果有人可以引导我朝着正确的方向前进,那将不胜感激。
我有一个相对简单的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 |
-------------------------------------------------------------------------------------------
如何引用特定年份的数据单元?
完成后,即可执行计算。
感谢您抽出宝贵时间来回复。
答案 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字段拖动到数据单元格的右侧,这将在组内添加新列。
接下来,我们要隐藏%chg列,除非它是列组的最后一个实例(在我的情况下为2016,在您的情况下为2017)
接下来,对于4个%change列中的每一个,右键单击灰色列标题,选择“列可见性”并将表达式设置为
=Fields![Year].Value <> MAX(Fields![Year].Value, "DataSet1")
当[Year]与整个名为“ DataSet1”的数据集中的最大[year]不同时,这基本上将'hidden'属性设置为True。 请注意,这是区分大小写的
运行报告时,我们得到以下输出。 (我添加了一些单元格格式来进行清理,[count]单元格设置为“ n0”,百分比单元格格式设置为“ p1”)
希望它足够接近您想要的东西。
答案 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)