Subselección con MDX
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
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.