MDX 中将指定的MEMBER变成变量后无法得到结果

0
各位大侠,初次学习MDX不太理解,请多多指教。
下面这个MDX是在SSRS的query desiner里运行的,有2个变量,2个维度会使用这个变量,当为具体的值是语句可以得到结果,但改成变量后就无法运行了。变量及需要更改的位置见下面代码的粗体部分。
 SELECT NON EMPTY { [Measures].[Act Corp USD Amount], [Measures].[FCST REV AMT USD], [Measures].[EXP CBS Mgmt USD AMT], [Measures].[FCST EXP CBS Mgmt USD AMT], [Measures].[EXP TOTAL USD AMT], [Measures].[FCST EXP AMT USD], [Measures].[AOP EXP CBS Mgmt USD AMT], [Measures].[AOP EXP USD MTD], [Measures].[AOP REV USD AMT MTD] } ON COLUMNS, NON EMPTY { ([DIM_COUNTRY].[COUNTRY].[COUNTRY].ALLMEMBERS * [dim_Date].[MonthName].[MonthName].ALLMEMBERS * [dim_Date].[MonthKey].[MonthKey].ALLMEMBERS ) } DIMENSION PROPERTIES MEMBER_CAPTION, MEMBER_UNIQUE_NAME ON ROWS FROM ( SELECT ( { [DIM_FCST_DATE].[MonthNumberOfYear].&[6] } ) ON COLUMNS FROM ( SELECT ( { [DIM_FCST_DATE].[CalendarYear].&[2014] } ) ON COLUMNS FROM (SELECT STRTOMEMBER('[dim_Date].[MonthNumberOfYear].[1]'):( STRTOMEMBER('[dim_Date].[MonthNumberOfYear].[' + @dimDateMonthNumberOfYear + ']') ) ON COLUMNS FROM ( SELECT ( STRTOSET(@dimDateCalendarYear, CONSTRAINED) ) ON COLUMNS FROM [Model])))) WHERE ( IIF( STRTOSET(@dimDateCalendarYear, CONSTRAINED).Count = 1, STRTOSET(@dimDateCalendarYear, CONSTRAINED), [dim_Date].[CalendarYear].currentmember ), IIF( STRTOSET(@dimDateMonthNumberOfYear, CONSTRAINED).Count = 1, STRTOSET(@dimDateMonthNumberOfYear, CONSTRAINED), [dim_Date].[MonthNumberOfYear].currentmember ), [DIM_FCST_DATE].[CalendarYear].&[2014], [DIM_FCST_DATE].[MonthNumberOfYear].&[6] ) CELL PROPERTIES VALUE, BACK_COLOR, FORE_COLOR, FORMATTED_VALUE, FORMAT_STRING, FONT_NAME, FONT_SIZE, FONT_FLAGS
以上语句运行成功。
但我需要把2014年和6月改成变量@dimDateCalendarYear和@dimDateMonthNumerOfYear,根据用户的选择来决定。
 
我改成了下面的样子,见粗体部分,但得不到任何结果,谁能帮忙看看是什么原因呢?
SELECT NON EMPTY { [Measures].[Act Corp USD Amount], [Measures].[FCST REV AMT USD], [Measures].[EXP CBS Mgmt USD AMT], [Measures].[FCST EXP CBS Mgmt USD AMT], [Measures].[EXP TOTAL USD AMT], [Measures].[FCST EXP AMT USD], [Measures].[AOP EXP CBS Mgmt USD AMT], [Measures].[AOP EXP USD MTD], [Measures].[AOP REV USD AMT MTD] } ON COLUMNS, NON EMPTY { ([DIM_COUNTRY].[COUNTRY].[COUNTRY].ALLMEMBERS * [dim_Date].[MonthName].[MonthName].ALLMEMBERS * [dim_Date].[MonthKey].[MonthKey].ALLMEMBERS ) } DIMENSION PROPERTIES MEMBER_CAPTION, MEMBER_UNIQUE_NAME ON ROWS FROM ( SELECT STRTOMEMBER('[dim_FCST_DATE].[MonthNumberOfYear].[' + @dimDateMonthNumberOfYear + ']') ON COLUMNS FROM ( SELECT STRTOMEMBER('[dim_FCST_DATE].[CalendarYear].[' + (@dimDateCalendarYear + ']') ON COLUMNS FROM (SELECT STRTOMEMBER('[dim_Date].[MonthNumberOfYear].[1]'):( STRTOMEMBER('[dim_Date].[MonthNumberOfYear].[' + @dimDateMonthNumberOfYear + ']') ) ON COLUMNS FROM ( SELECT ( STRTOSET(@dimDateCalendarYear, CONSTRAINED) ) ON COLUMNS FROM [Model])))) WHERE ( IIF( STRTOSET(@dimDateCalendarYear, CONSTRAINED).Count = 1, STRTOSET(@dimDateCalendarYear, CONSTRAINED), [dim_Date].[CalendarYear].currentmember ), IIF( STRTOSET(@dimDateMonthNumberOfYear, CONSTRAINED).Count = 1, STRTOSET(@dimDateMonthNumberOfYear, CONSTRAINED), [dim_Date].[MonthNumberOfYear].currentmember ), STRTOMEMBER('[dim_FCST_DATE].[CalendarYear].[' + (@dimDateCalendarYear + ']'),STRTOMEMBER('[dim_FCST_DATE].[MonthNumberOfYear].[' + @dimDateMonthNumberOfYear + ']' )) CELL PROPERTIES VALUE, BACK_COLOR, FORE_COLOR, FORMATTED_VALUE, FORMAT_STRING, FONT_NAME, FONT_SIZE, FONT_FLAGS
 
已邀请:
0

天桥下的郑成功 - Hadoop大数据开发工程师、数仓架构师、熟悉数据仓库设计、Hadoop、Spark、HBase、Hive、SSIS等开发 2015-05-13 回答

这个SSRS会帮你自动完成的,为何你没有做到呢?
你看看我这个截图,然后试着做一遍
1.png

2.png

3.png

 
0

sue_huangyong - BI新手 2015-05-13 回答

你说的没错,其实SSRS帮我做了一切,不过这两个参数我需要传到不同的维度表里,我可不希望让用户输入2次年月的条件。
这个SSRS没法做,只能在此基础上对MDX进行修改。然后就出不来结果了。
其实,一个维度我是希望用户输入6月,则选择1-6月的记录,另一个维护只希望选择6月这一个值,所以需要再次加工。
0

sue_huangyong - BI新手 2015-05-13 回答

下图是通过向导直接生成出来的MDX,其中DIM_FCST_DATE维度里的两个变量取的是一个常量,后面一步将会取dim_date里的两个参数

ssrs.jpg

 
也就是我希望用户输入一次年和月,DIM_DATE那个维度是取1-当前选择的月份,而DIM_FCST_DATE那个维度只取当前选择的月份。如上图所示的那样。下图是上图转换成了MDX语句后的结果,我是在这个基础上改的语句。

MDX.jpg

 
可以看到我把其中的:
SELECT ( { [DIM_FCST_DATE].[MonthNumberOfYear].&[12] } ) ON COLUMNS
换成了
SELECT ( STRTOMEMBER('[DIM_FCST_DATE].[MonthNumberOfYear].[' + @dimMonthNumberOfYear + ']' ) ON COLUMNS
 
同样的:
SELECT ( { [DIM_FCST_DATE].[CalendarYear].&[2014] } ) ON COLUMNS
换成了
SELECT STRTOMEMBER('[dim_FCST_DATE].[CalendarYear].[' + (@dimDateCalendarYear + ']') ON COLUMNS
 
而且,为了达到选择月份的一个区间,1-当前所选择的月份,我把下面的也改了
SELECT ( STRTOSET(@dimDateMonthNumberOfYear, CONSTRAINED) ) ON COLUMNS
改成:
SELECT STRTOMEMBER('[dim_Date].[MonthNumberOfYear].[1]'):( STRTOMEMBER('[dim_Date].[MonthNumberOfYear].[' + @dimDateMonthNumberOfYear + ']') ) ON COLUMNS
这个在其它的报表证明是可行的了。
 
但是改完后什么也显示不了,连字段都不显示了,很苦恼啊
0

天桥下的郑成功 - Hadoop大数据开发工程师、数仓架构师、熟悉数据仓库设计、Hadoop、Spark、HBase、Hive、SSIS等开发 2015-05-13 回答

你时间维度是这样写的吗?
[dim_Date].[MonthNumberOfYear].[1] 在mdx里是这样的?
你把这个维度拖到 mdx查询器里它怎么显示的?
是 [dim_Date].[MonthNumberOfYear].[1] 还是 [dim_Date].[MonthNumberOfYear].&[1]

你先把这个语句在 mdx里写的能查询了,再转
0

sue_huangyong - BI新手 2015-05-13 回答

是后者
[dim_Date].[MonthNumberOfYear].&[1]
这个是能执行的,就是想变成参数的就不行了
0

sue_huangyong - BI新手 2015-05-13 回答

甚至我写成下面的也可以执行
SELECT STRTOMEMBER('[dim_FCST_DATE].[CalendarYear].[2014]') ON COLUMNS
 
就是不能写成
SELECT STRTOMEMBER('[dim_FCST_DATE].[CalendarYear].[' + (@dimDateCalendarYear + ']') ON COLUMNS
 
难道@dimDateCalendarYear的值不是2014?下图是选择的界面。
para2.jpg


para1.jpg

 
0

天桥下的郑成功 - Hadoop大数据开发工程师、数仓架构师、熟悉数据仓库设计、Hadoop、Spark、HBase、Hive、SSIS等开发 2015-05-13 回答

你的拼接有问题,改成我这样试试注意是双引号
"Select From Cube "
+ "where STRTOMEMBER(""[Time].[Year - Quarter - Month - Day].[Year].&["" + cstr( @TimeYear ) + ""-01-01T00:00:00]"" "

 
0

sue_huangyong - BI新手 2015-05-14 回答

还是一样的问题。
其实我要请教的有2个问题:
1。用户选择6月份,我需要转换成相当于用户勾选了1-6月份6个复选框。
SELECT STRTOMEMBER('[dim_Date].[MonthNumberOfYear].[1]'):( STRTOMEMBER('[dim_Date].[MonthNumberOfYear].[' + @dimDateMonthNumberOfYear + ']') ) ON COLUMNS
以上可以运行,但实际只显示了6月份一个月的记录。
2。另一个表达式只是将参数替换掉常量6月份。
SELECT ( { [DIM_FCST_DATE].[MonthNumberOfYear].&[6] } ) ON COLUMNS
这个是可以运行的,结果也正确
可是改成用户输入的参数时见如下
SELECT STRTOMEMBER('[dim_FCST_DATE].[MonthNumberOfYear].[' + (@dimMonthNumberOfYear + ']') ON COLUMNS
就连结果的字段都不显示了,肯定是报了错,但没显示什么错。
其中的变量@dimMonthNumberOfYear在参数里是通过dim_date维度表选择出来的,但上面的语句是需要转递给[dim_FCST_DATE]这个维度表,因为不希望用户输入2次年月的条件。
0

sue_huangyong - BI新手 2015-05-14 回答

第2个问题我大概猜到是什么原因了,@dimMonthNumberOfYear返回的值是带限定符的,如:[dim_Date].[MonthNumberOfYear].&[6],因此我需要截去前面的部分,只取出6,不知道有没有更好的办法。
对于第1个问题,我即使写成常量也没法取到1-6个月的数据,只能取到6月份1个月的数据。
SELECT STRTOMEMBER('[dim_Date].[MonthNumberOfYear].[1]'):( STRTOMEMBER('[dim_Date].[MonthNumberOfYear].[12]') ) ON COLUMNS
这个有办法吗?对于单选条件,只选择1个月,也返回从1-选择的月份。
0

天桥下的郑成功 - Hadoop大数据开发工程师、数仓架构师、熟悉数据仓库设计、Hadoop、Spark、HBase、Hive、SSIS等开发 2015-05-14 回答

你说你只查出一个月的,StrToMember 是一个元祖,你现在要一个Set。 你把 StroToMember 改成 StrToSet试试

 
0

sue_huangyong - BI新手 2015-05-15 回答

直接替换成STRTOSET会报语法错误,因为需要2个参数。
0

天桥下的郑成功 - Hadoop大数据开发工程师、数仓架构师、熟悉数据仓库设计、Hadoop、Spark、HBase、Hive、SSIS等开发 2015-05-15 回答

加 CONSTRAINED 试试
0

sue_huangyong - BI新手 2015-05-19 回答

还是不行,报语法错误呢
0

sue_huangyong - BI新手 2015-05-19 回答

第1个问题我换了写法,终于出来了
 改成如下,第3个参数是多少,就是从1月份到哪个月份的数据
Subset([dim_Date].[MonthNumberOfYear].allmembers,1,6
 
那就差最后一个问题了,怎么取出参数里的值,而不是前面一堆的里的内容呢?

如:parameter @dimDateMonthNumberOfYear=[dim_Date].[MonthNumberOfYear].&[12]
我只想取出12该怎么写?

 
0

sue_huangyong - BI新手 2015-05-21 回答

终于还是通过拼接字符串解决了取参数里的值的问题,实在不是一个好的方案。希望能听到好的。

要回复问题请先登录注册