Pregunta

Saludos pila comunidad de desbordamiento.

He recientemente empecé a construir un cubo OLAP en SSAS2008 y he quedado atascado. Le agradecería si alguien al menos me podría apuntar en la dirección correcta.

Situación : Dos tablas de hecho, el mismo cubo. FactCalls contiene información sobre las llamadas realizadas por los abonados, FactTopups contiene datos TopUp. Ambas tablas tienen numerosas dimensiones comunes siendo una de ellas la dimensión de abonado.

  

FactCalls FactTopups
  SubscriberKey SubscriberKey
  Duración de la llamada DateKey
  CallCost Topup Valor   ...

Lo que estoy tratando de lograr es ser capaz de crear informes en base a los suscriptores FactCalls distintos que se reponía sus cuentas dentro de los últimos 7 días.

Lo que estoy básicamente buscando una MDX equivalente a SQL de:

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

He intentado crear una dimensión degenerada para ambas tablas que contienen SubscriberKey y haciendo:

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

Sin éxito.

Saludos cordiales,

Vince

¿Fue útil?

Solución

Es probable que encontrar algo como lo siguiente sería un mejor desempeño. El enfoque de filtro se verá obligado a iterar a través de cada abonado, mientras que la función NonEmpty () puede tomar ventaja de optimizaciones en el motor de almacenamiento.

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] ; 

Otros consejos

Usted sabe cómo a veces son las soluciones más simples y obvias que de alguna manera se eluden? Bueno, esto es al parecer uno de ellos. Dicen "MDX no es SQL" y ahora sé lo que significan. He estado trabajando en esto desde un punto de vista totalmente SQL, obviando completamente el uso obvio del comando de filtro.

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] ; 

Embarazosamente sencilla.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top