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
下面这个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
没有找到相关结果
重要提示:提问者不能发表回复,可以通过评论与回答者沟通,沟通后可以通过编辑功能完善问题描述,以便后续其他人能够更容易理解问题.
15 个回复
天桥下的郑成功 - Hadoop大数据开发工程师、数仓架构师、熟悉数据仓库设计、Hadoop、Spark、HBase、Hive、SSIS等开发 2015-05-13 回答
赞同来自:
你看看我这个截图,然后试着做一遍
sue_huangyong - BI新手 2015-05-13 回答
赞同来自:
这个SSRS没法做,只能在此基础上对MDX进行修改。然后就出不来结果了。
其实,一个维度我是希望用户输入6月,则选择1-6月的记录,另一个维护只希望选择6月这一个值,所以需要再次加工。
sue_huangyong - BI新手 2015-05-13 回答
赞同来自:
也就是我希望用户输入一次年和月,DIM_DATE那个维度是取1-当前选择的月份,而DIM_FCST_DATE那个维度只取当前选择的月份。如上图所示的那样。下图是上图转换成了MDX语句后的结果,我是在这个基础上改的语句。
可以看到我把其中的:
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
这个在其它的报表证明是可行的了。
但是改完后什么也显示不了,连字段都不显示了,很苦恼啊
天桥下的郑成功 - Hadoop大数据开发工程师、数仓架构师、熟悉数据仓库设计、Hadoop、Spark、HBase、Hive、SSIS等开发 2015-05-13 回答
赞同来自:
[dim_Date].[MonthNumberOfYear].[1] 在mdx里是这样的?
你把这个维度拖到 mdx查询器里它怎么显示的?
是 [dim_Date].[MonthNumberOfYear].[1] 还是 [dim_Date].[MonthNumberOfYear].&[1]
你先把这个语句在 mdx里写的能查询了,再转
sue_huangyong - BI新手 2015-05-13 回答
赞同来自:
[dim_Date].[MonthNumberOfYear].&[1]
这个是能执行的,就是想变成参数的就不行了
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?下图是选择的界面。
天桥下的郑成功 - 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]"" "
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次年月的条件。
sue_huangyong - BI新手 2015-05-14 回答
赞同来自:
对于第1个问题,我即使写成常量也没法取到1-6个月的数据,只能取到6月份1个月的数据。
SELECT STRTOMEMBER('[dim_Date].[MonthNumberOfYear].[1]'):( STRTOMEMBER('[dim_Date].[MonthNumberOfYear].[12]') ) ON COLUMNS
这个有办法吗?对于单选条件,只选择1个月,也返回从1-选择的月份。
天桥下的郑成功 - Hadoop大数据开发工程师、数仓架构师、熟悉数据仓库设计、Hadoop、Spark、HBase、Hive、SSIS等开发 2015-05-14 回答
赞同来自:
sue_huangyong - BI新手 2015-05-15 回答
赞同来自:
天桥下的郑成功 - Hadoop大数据开发工程师、数仓架构师、熟悉数据仓库设计、Hadoop、Spark、HBase、Hive、SSIS等开发 2015-05-15 回答
赞同来自:
sue_huangyong - BI新手 2015-05-19 回答
赞同来自:
sue_huangyong - BI新手 2015-05-19 回答
赞同来自:
改成如下,第3个参数是多少,就是从1月份到哪个月份的数据
Subset([dim_Date].[MonthNumberOfYear].allmembers,1,6
那就差最后一个问题了,怎么取出参数里的值,而不是前面一堆的里的内容呢?
如:parameter @dimDateMonthNumberOfYear=[dim_Date].[MonthNumberOfYear].&[12]
我只想取出12该怎么写?
sue_huangyong - BI新手 2015-05-21 回答
赞同来自: