2010-03-19 23 views
2

Salutations communauté de débordement de pile.Sous-sélection avec MDX

J'ai récemment commencé à créer un cube OLAP dans SSAS2008 et je me suis retrouvé coincé. Je serais reconnaissant si quelqu'un pouvait au moins me diriger vers la bonne direction.

Situation: Deux tables de faits, même cube. FactCalls contient des informations sur les appels effectués par les abonnés, FactTopups contient les données de recharge. Les deux tables ont de nombreuses dimensions communes, l'une d'entre elles étant la dimension Abonné.

FactCalls                           FactTopups
SubscriberKey             SubscriberKey
CallDuration                   DateKey
CallCost                               Topup Valeur ...

Ce que je suis en train de réaliser est de pouvoir construire FactCal Ls rapports basés sur des abonnés distincts qui ont rechargé leurs comptes au cours des 7 derniers jours.

Ce que je recherche essentiellement pour un équivalent MDX à SQL de:

select * 
    from FactCalls 
where SubscriberKey in 
     (select distinct SubscriberKey from FactTopups where ...); 

J'ai essayé de créer une dimension dégénérée pour les tables contenant SubscriberKey et faire:

Exist( 
     [Calls Degenerate].[Subscriber Key].Children, 
     [Topups Degenerate].[Subscriber Key].Children 
    ) 

Sans succès.

Cordialement,

Vince

Répondre

2

Vous trouverez probablement quelque chose comme ce qui suit serait mieux. L'approche du filtre sera forcée à parcourir chaque abonné, tandis que la fonction NonEmpty() peut tirer parti des optimisations dans le moteur de stockage.

select non empty{ 
     [Measures].[Count], 
     [Measures].[Cost], 
     [Measures].[Topup Value] 

     } on columns, 
     { 
NonEmtpy([Subscriber].[Subscriber Key].Children,  
      ([Measures].[Topups Count],  
       [Topup Date].[Calendar].[Month Name].&[2010]&[3])) 
    } on rows 
from [Calls] ; 
1

Vous savez comment il est parfois les solutions les plus simples et les plus évidentes que d'une certaine manière vous échapper? Eh bien, c'est apparemment l'un d'entre eux. Ils disent que "MDX n'est pas SQL" et je sais maintenant ce qu'ils veulent dire. J'ai travaillé à ce sujet d'un point de vue entièrement SQL, en ignorant complètement l'utilisation évidente de la commande de filtre.

with set [OnlyThoseWithTopupsInMarch2010] as 
    filter( 
      [Subscriber].[Subscriber Key].Children, 
      ([Measures].[Topups Count], 
       [Topup Date].[Calendar].[Month Name].&[2010]&[3]) > 0 
     ) 

select non empty{ 
     [Measures].[Count], 
     [Measures].[Cost], 
     [Measures].[Topup Value] 

     } on columns, 
     non empty{ [Test] } on rows 
from [Calls] ; 

D'une manière simple.