Hirereachy используется более одного раза в функции перекрестного соединения - PullRequest
0 голосов
/ 16 октября 2018

У меня запрос MDX, который выдает ошибку - «Иерархия portalID используется более одного раза в функции перекрестного соединения»

Запрос не выполняется в предложении where

WHERE 
            (-{[SG Location].[PortalID].[30],
            [SG Location].[PortalID].[46]},
            [SG Location].[PortalID].[4],
            [SG Program].[Campaign].&[*Cymbalta_Lilly (111)], 
            [Prints], 
            [SG Location].[IsTest].[0]
            )

InУсловие where выше приведенного ниже условия (исключая несколько порталов) добавляется динамически

-{[SG Location].[PortalID].[30],
 [SG Location].[PortalID].[46]}

Пожалуйста, помогите!Я новичок в запросах MDX.Любая полезная ссылка, относящаяся к запросам MDX - особенно о предложении where - действительно приветствуется.

Ниже приведен полный запрос MDX

            WITH 
            MEMBER [SG Date].[Day].[TotPrintCount] AS 
            SUM(
                    {
                        [SG Date].[Day].&[2018-06-15], 
                        [SG Date].[Day].&[2018-06-16], 
                        [SG Date].[Day].&[2018-06-17], 
                        [SG Date].[Day].&[2018-06-18]
                    },
                        [Measures].[Prints]
                )    
            MEMBER [SG Date].[Day].[TotCustRev] AS 
            SUM(
                    {
                        [SG Date].[Day].&[2018-06-15], 
                        [SG Date].[Day].&[2018-06-16], 
                        [SG Date].[Day].&[2018-06-17], 
                        [SG Date].[Day].&[2018-06-18]
                    },
                        [Measures].[CustRev]
                )    
            MEMBER [SG Date].[Day].[TotLDMRev] AS 
            SUM(
                    {
                        [SG Date].[Day].&[2018-06-15], 
                        [SG Date].[Day].&[2018-06-16], 
                        [SG Date].[Day].&[2018-06-17], 
                        [SG Date].[Day].&[2018-06-18]
                    },
                        [Measures].[LDMRev]
                )    
            MEMBER [Measures].[RevRatio] AS [Measures].[LDMRev] / [Measures].[Transactions] * 1000    
            MEMBER [Measures].[MatchRatio] AS SUM([Measures].[PaidPrints]) / SUM([Measures].[Transactions]) * 100 
            SELECT { 
                    [SG Date].[Day].[TotPrintCount], 
                    [SG Date].[Day].&[2018-06-15], 
                    [SG Date].[Day].&[2018-06-16], 
                    [SG Date].[Day].&[2018-06-17], 
                    [SG Date].[Day].&[2018-06-18], 
                    [SG Date].[Day].[TotCustRev], 
                    [SG Date].[Day].[TotLDMRev]} 
            ON COLUMNS, NON EMPTY 
            { 
                { [SG Location].[Hierarchy].[Portal].ALLMEMBERS } * { [SG Program].[Hierarchy].ALLMEMBERS } 
            } ON ROWS FROM [ScriptGuide] 

            WHERE 
                (-{[SG Location].[PortalID].[30],
                [SG Location].[PortalID].[46]},
                [SG Location].[PortalID].[4],
                [SG Program].[Campaign].&[*Cymbalta_Lilly (111)], 
                [Prints], 
                [SG Location].[IsTest].[0]
                )

1 Ответ

0 голосов
/ 20 ноября 2018

То, что вы ДОЛЖНЫ сделать, - это не использовать иерархию более одного раза.Но из вашего заявления, что это «добавлено динамически», я предполагаю, что это делается другим модулем, и для отдельных модулей является проблемой согласовать их фильтры иерархии.В этом случае - создайте подзапрос, например, так:

WITH 
    (...)
SELECT 
    (...)
FROM (
    SELECT (-{[SG Location].[PortalID].[30], [SG Location].[PortalID].[46]}) on 0 FROM [ScriptGuide] 
)
WHERE 
(
    [SG Location].[PortalID].[4],
    [SG Program].[Campaign].&[*Cymbalta_Lilly (111)], 
    [Prints], 
    [SG Location].[IsTest].[0]
)

То, что мы здесь делаем, - это перенос исключений PortalID по умолчанию в подзапрос в FROM.Этот запрос выполняется первым, и, таким образом, основной запрос не видит его как конфликтующий.

Если это глобальный (или, по крайней мере, глобальный) фильтр удаления PortalID - имеет смысл толкнуть его вподзапрос.

...