Sql server 用于查找上一年SSR值的表达式
我需要一些表达式方面的帮助。我需要一个报告,显示本年度以及上一年度关于此规则表达式的字段计算(Last Last previous)/Last previous*100。此外,该报告还以年份参数运行。 下面是结果的示例Sql server 用于查找上一年SSR值的表达式,sql-server,reporting-services,mdx,Sql Server,Reporting Services,Mdx,我需要一些表达式方面的帮助。我需要一个报告,显示本年度以及上一年度关于此规则表达式的字段计算(Last Last previous)/Last previous*100。此外,该报告还以年份参数运行。 下面是结果的示例 例如,我选择了2010年、2011年和2012年 year Data 2010 2011 2012 hp 14 25 30 Dell 17 18 20
例如,我选择了2010年、2011年和2012年
year
Data 2010 2011 2012
hp 14 25 30
Dell 17 18 20
我想要的结果是什么
year
Data 2010 2011 2012 2011/2012
hp 14 25 30 0.002 (Last -Last Previous)/(last Previous*100) =(30-25)/(25*100)
Dell 17 18 20 0.0040
我该怎么做
SELECT
NON EMPTY
{[Measures].[Val]} ON COLUMNS
,NON EMPTY
{
[DimCAT].[lbl].[lbl].ALLMEMBERS * [DimDate].[Year].[Year].ALLMEMBERS
} ON ROWS
FROM [Data];
如果您有机会更改源数据集,我将使用未指定年份的数据集,并且数据上的行数按年份降序排列。这样你就可以过滤你想要的最后两年。 (这是在SSRS 2008中测试的,可能有更简单的方法,尤其是在以后的版本中) 并对年份进行列分组,对数据进行行分组。 两组相交单元格上的表达式和(Field!Measure.Value) 在列组后添加列,并将表达式添加到标题单元格
=MAX(iif(Fields!i.Value = 2,Fields!year.Value.ToString(),""))+"/"+ MAX(iif(Fields!i.Value = 1,Fields!year.Value.ToString(),""))
细胞的下一个表达
=iif(SUM(iif(Fields!i.Value = 2,Fields!measure.Value,0))=0,0,SUM(iif(Fields!i.Value = 1,Fields!measure.Value,0))-SUM(iif(Fields!i.Value = 2,Fields!measure.Value,0)) / (SUM(iif(Fields!i.Value = 2,Fields!measure.Value,0))*100))
我认为这个公式还可以,但它返回的值与您发布的预期值不同。通过
mdx
您需要使用WITH
子句。添加的
计算成员
称为2011/12
,但实际上是与上一年相比的年度层次结构的最后一个成员-因此可能不完全是您需要的:
WITH
MEMBER [DimDate].[Year].[2011/12] AS
(
Tail([DimDate].[Year].[Year].ALLMEMBERS).Item(0).Item(0)
-
Tail([DimDate].[Year].[Year].ALLMEMBERS).Item(0).Item(0).PrevMember
)
/
Tail([DimDate].[Year].[Year].ALLMEMBERS).Item(0).Item(0).PrevMember
* 100
SELECT
NON EMPTY
{
[DimDate].[Year].[Year].ALLMEMBERS
,[DimDate].[Year].[2011/12]
} ON COLUMNS
,NON EMPTY
{[DimCAT].[lbl].[lbl].ALLMEMBERS} ON ROWS
FROM [Data]
WHERE
[Measures].[Val];
使用stroset
功能,您可以使用以下参数获得单个成员集:
WITH
SET [s] AS
StrToSet('{[DimDate].[Year].[Year].[' + @Yr + ']}')
MEMBER [DimDate].[Year].[LastVsPrev] AS
([s].Item(0).Item(0) - [s].Item(0).Item(0).PrevMember)
/
[s].Item(0).Item(0).PrevMember
* 100
SELECT
NON EMPTY
Union
(
{
[s].Item(0).Item(0).PrevMember.PrevMember : [s].Item(0).Item(0)
}
,{[DimDate].[Year].[LastVsPrev]}
) ON COLUMNS
,NON EMPTY
{[DimCAT].[lbl].[lbl].ALLMEMBERS} ON ROWS
FROM [Data]
WHERE
[Measures].[Val];
按年份旋转查询,然后您就可以应用表达式了。您好,您能解释更多吗?您能添加您正在使用的MDX查询吗?这是MDX查询在列上选择非空{[Measures].[Val]},在[Data]的行上选择非空{([DimCAT].[lbl].[lbl].ALLMEMBERS*[DimDate].[Year].[Year].[ALLMEMBERS]}感谢您的回答,但我使用mdx qeury,我正在尝试使用vb.net编写一个脚本,以获取上一个值,但我的报告在年份参数上运行OK-那么您有
@Yr
,它等于最后一列中的年份?i、 e.@Yr
=2012
?好的,那么@Yr可能是2012年、2013年或2014年,这取决于用户选择什么?确切地说,我没有找到解决方案,你怎么能这样做,因为我的问题是ssrs中的上一个值我有函数last来获取上一个值,但上一个我没有函数
WITH
SET [s] AS
StrToSet('{[DimDate].[Year].[Year].[' + @Yr + ']}')
MEMBER [DimDate].[Year].[LastVsPrev] AS
([s].Item(0).Item(0) - [s].Item(0).Item(0).PrevMember)
/
[s].Item(0).Item(0).PrevMember
* 100
SELECT
NON EMPTY
Union
(
{
[s].Item(0).Item(0).PrevMember.PrevMember : [s].Item(0).Item(0)
}
,{[DimDate].[Year].[LastVsPrev]}
) ON COLUMNS
,NON EMPTY
{[DimCAT].[lbl].[lbl].ALLMEMBERS} ON ROWS
FROM [Data]
WHERE
[Measures].[Val];