MDX:循环遍历变量和填充表

时间:2017-08-02 08:49:06

标签: ssas mdx olap

是否可以在MDX中循环几个变量?我想基于3个条件过滤我的查询,每个条件包含2 * 2 * 3个变量。我正在寻找一种比改变WHERE子句12次更好的方法来制作12个表并最终一起追加。

这就是我想象的样子:

Market  2015 2016 2017 Condition1 Condition2 Condition3
Market 1 $$   $$   $$      ABC      Direct       B2B
Market 1 $$   $$   $$      ABC      Direct       B2C
Market 1 $$   $$   $$      ABC      Direct       Other
Market 1 $$   $$   $$      ABC      Trade        B2B
Market 1 $$   $$   $$      ABC      Trade        B2C
Market 1 $$   $$   $$      ABC      Trade        Other
Market 1 $$   $$   $$      DEF      Direct       B2B
Market 1 $$   $$   $$      DEF      Direct       B2C
Market 1 $$   $$   $$      DEF      Direct       Other
Market 1 $$   $$   $$      DEF      Trade        B2B
Market 1 $$   $$   $$      DEF      Trade        B2C
Market 1 $$   $$   $$      DEF      Trade        Other
       ...

编辑:这是我的查询(可能不是最佳的,因为我是MDX中的总菜鸟):

WITH
SET [Market1] AS (
    [Market].[Market].[Market].&[103],
    EXCEPT({[Agency].[Nationality - Consortium - Agency].[Nationality].ALLMEMBERS}, 
        {[Agency].[Nationality - Consortium - Agency].[Nationality].&[111],
        [Agency].[Nationality - Consortium - Agency].[Nationality].&[116],
        [Agency].[Nationality - Consortium - Agency].[Nationality].&[242],
        [Agency].[Nationality - Consortium - Agency].[Nationality].&[134]}
    ))


SET [Market2] AS (
    [Market].[Market].[Market].&[106],
    EXCEPT({[Agency].[Nationality - Consortium - Agency].[Nationality].ALLMEMBERS}, 
        {[Agency].[Nationality - Consortium - Agency].[Nationality].&[192],
        [Agency].[Nationality - Consortium - Agency].[Nationality].&[157]}
    ))


SET [Market3] AS {(
    [Market].[Market].[Market].&[102],
    EXCEPT({[Source Currency].[Source Currency Code].[All].children}, 
        {[Source Currency].[Source Currency Code].[EUR], 
        [Source Currency].[Source Currency Code].[USD]}),
    EXCEPT({[Agency].[Nationality - Consortium - Agency].[Nationality].ALLMEMBERS}, 
        {[Agency].[Nationality - Consortium - Agency].[Nationality].&[112],
        [Agency].[Nationality - Consortium - Agency].[Nationality].&[309]})
    ),
    (
    [Market].[Market].[Market].&[102],
    [Source Currency].[Source Currency Code].[EUR],
    [Agency].[Nationality - Consortium - Agency].[Nationality].&[186]
    )} 


SET [Market4] AS {
    ([Market].[Market].[Market].&[105],
    [Source Currency].[Source Currency Code].[All]), 
    ([Market].[Market].[Market].&[102],
    [Source Currency].[Source Currency Code].[USD])}

SET [Market5] AS {(
    [Market].[Market].[Market].&[102],
    [Source Currency].[Source Currency Code].[EUR],
    EXCEPT({[Agency].[Nationality - Consortium - Agency].[Nationality].ALLMEMBERS}, 
        {[Agency].[Nationality - Consortium - Agency].[Nationality].&[112],
        [Agency].[Nationality - Consortium - Agency].[Nationality].&[186],
        [Agency].[Nationality - Consortium - Agency].[Nationality].&[139],
        [Agency].[Nationality - Consortium - Agency].[Nationality].&[180],
        [Agency].[Nationality - Consortium - Agency].[Nationality].&[188],
        [Agency].[Nationality - Consortium - Agency].[Nationality].&[234],
        [Agency].[Nationality - Consortium - Agency].[Nationality].&[269],
        [Agency].[Nationality - Consortium - Agency].[Nationality].&[291],
        [Agency].[Nationality - Consortium - Agency].[Nationality].&[185],
        [Agency].[Nationality - Consortium - Agency].[Nationality].&[195],
        [Agency].[Nationality - Consortium - Agency].[Nationality].&[203],
        [Agency].[Nationality - Consortium - Agency].[Nationality].&[253],
        [Agency].[Nationality - Consortium - Agency].[Nationality].&[283],
        [Agency].[Nationality - Consortium - Agency].[Nationality].&[243] 
        })),
    (
    [Market].[Market].[Market].&[102],
    [Source Currency].[Source Currency Code].[GBP],
    [Agency].[Nationality - Consortium - Agency].[Nationality].&[309]
    ),
    (
    [Market].[Market].[Market].&[103],
    [Source Currency].[Source Currency Code].[All],
    {[Agency].[Nationality - Consortium - Agency].[Nationality].&[111],
    [Agency].[Nationality - Consortium - Agency].[Nationality].&[116],
    [Agency].[Nationality - Consortium - Agency].[Nationality].&[242],
    [Agency].[Nationality - Consortium - Agency].[Nationality].&[134]}
    ),
    (
    [Market].[Market].[Market].&[106],
    [Source Currency].[Source Currency Code].[All],
    {[Agency].[Nationality - Consortium - Agency].[Nationality].&[192],
    [Agency].[Nationality - Consortium - Agency].[Nationality].&[157]}
    )}

SET [Market6] AS {(
    [Market].[Market].[Market].&[102],
    [Source Currency].[Source Currency Code].[All],
    [Agency].[Nationality - Consortium - Agency].[Nationality].&[112]
    ), 
    ([Market].[Market].[Market].&[102],
    [Source Currency].[Source Currency Code].[EUR],
    {[Agency].[Nationality - Consortium - Agency].[Nationality].&[139],
    [Agency].[Nationality - Consortium - Agency].[Nationality].&[180],
    [Agency].[Nationality - Consortium - Agency].[Nationality].&[188],
    [Agency].[Nationality - Consortium - Agency].[Nationality].&[234],
    [Agency].[Nationality - Consortium - Agency].[Nationality].&[269],
    [Agency].[Nationality - Consortium - Agency].[Nationality].&[291],
    [Agency].[Nationality - Consortium - Agency].[Nationality].&[185],
    [Agency].[Nationality - Consortium - Agency].[Nationality].&[195],
    [Agency].[Nationality - Consortium - Agency].[Nationality].&[203],
    [Agency].[Nationality - Consortium - Agency].[Nationality].&[253],
    [Agency].[Nationality - Consortium - Agency].[Nationality].&[283],
    [Agency].[Nationality - Consortium - Agency].[Nationality].&[243]
    })}

SET [Market7] AS (
    [Market].[Market].[Market].&[104],
    EXCEPT({[Agency].[Market - Agency].[Agency].ALLMEMBERS}, 
        {[Agency].[Market - Agency].[Agency].&[155861]}
    ))

SET [Market8] AS (
    [Market].[Market].[Market].&[104],
    [Agency].[Market - Agency].[Agency].&[155861]
)

SET [YTD2015] AS (
[Departure Date].[Year].&[2015],
StrToMember("[Report Date].[Report Date].&[" + Str(Int(CDbl(Now()) - 38718 - 731)) + "]")
)

SET [YTD2016] AS (
[Departure Date].[Year].&[2016],
StrToMember("[Report Date].[Report Date].&[" + Str(Int(CDbl(Now()) - 38718 - 365)) + "]")
)

SET [YTD2017] AS (
[Departure Date].[Year].&[2017],
StrToMember("[Report Date].[Report Date].&[" + Str(Int(CDbl(Now()) - 38718)) + "]")
)

MEMBER [Market].[Market].[Market1] AS
SUM([Market1], [Measures].[Price])

MEMBER [Market].[Market].[Market2] AS
SUM([Market2], [Measures].[Price])

MEMBER [Market].[Market].[Market3] AS
SUM([Market3], [Measures].[Price])

MEMBER [Market].[Market].[Market4] AS
SUM([Market4], [Measures].[Price])

MEMBER [Market].[Market].[Market5] AS
SUM([Market5], [Measures].[Price])

MEMBER [Market].[Market].[Market6] AS
SUM([Market6], [Measures].[Price])

MEMBER [Market].[Market].[Market7] AS
SUM([Market7], [Measures].[Price])

MEMBER [Market].[Market].[Market8] AS
SUM([Market8], [Measures].[Price])

MEMBER [Market].[Market].[Grand Total] AS 
SUM([Market].[Market].[All], [Measures].[Price])

SELECT {[YTD2015], [YTD2016],
        [YTD2017]} ON COLUMNS,
    {[Market].[Market].[Market1], [Market].[Market].[Market2],
    [Market].[Market].[Market3], [Market].[Market].[Market4],
    [Market].[Market].[Market5], [Market].[Market].[Market6],
    [Market].[Market].[Market7], [Market].[Market].[Market8],
    [Market].[Market].[Grand Total]} ON ROWS
FROM [Booking]
WHERE ({ [Travel Type].[Travel Type].&[101],
        [Travel Type].[Travel Type].&[102],
        [Travel Type].[Travel Type].&[103] })

所以现在我得到了这三年每个市场的年度总和。现在我想在上面提到的组中进一步分割这个总数。

1 个答案:

答案 0 :(得分:0)

我从一个错误的角度思考它,我用交叉连接解决了它(我之前从未听说过)。

这是一篇关于交叉连接的好文章: http://www.databasejournal.com/features/mssql/article.php/10894_3334631_3/MDX-Essentials-Basic-Set-Functions-The-CrossJoin-Function.htm