2013-12-16 10 views
5

sto usando cubo Sales del icCube imparare MDX. Vorrei scrivere una query MDX per mostrare i ricavi delle vendite nel 2009 per quei paesi in cui le entrate derivanti dalle vendite nel 2010 erano superiori a $ 80.000. Ho provato quanto segue, ma tornato una tabella vuota con una sola colonna ([importo]):MDX: Filtraggio e affettare a diversi membri della stessa dimensione

WITH 
SET [myset] AS Filter([Country].members, ([Measures].[Amount], [2010])>80000) 
select [Country].members on 0, [Amount] on 1 
from (select [myset] on 0, [Amount] on 1 from [sales]) 
where [2009] 

risposta

2

Basta usare

WITH 
SET [myset] AS Filter([Country].members, ([Measures].[Amount], [2010])>80000) 
select [myset] on 0, [Amount] on 1 
from [sales] 
where [2009] 

In MDX, questo tipo di query non ha bisogno di una selezione secondaria o WHERE. E ancora potrebbe omettere il set myset, scrivendo

select Filter([Country].members, ([Measures].[Amount], [2010])>80000) on 0, 
     [Amount] on 1 
from [sales] 
where [2009] 

ho provato una query simile su opere avventura, e si vede tutti i clienti, Australia, Canada e Stati Uniti, ma non Francia, Germania e Regno Unito:

SELECT Filter([Customer].[Country].Members, 
       ([Measures].[Internet Sales Amount], [Date].[Calendar Year].&[2006]) > 600000 
      ) 
     ON 0, 
     {[Measures].[Internet Sales Amount]} 
     ON 1 
FROM [Adventure Works] 
WHERE [Date].[Calendar Year].&[2008] 
+0

Questo non funziona. Restituisce una tabella vuota. Capisco che affettare sul [2009] si libera di tutti i dati relativi a [2010] ... – AlwaysLearning

+0

@MeirGoldenberg Ho verificato la mia domanda - con gli opportuni adeguamenti - con MS Adventure Works, vedere la mia risposta modificato. Presumo che ci sia qualcos'altro che non va nella tua query o nei tuoi dati. – FrankPl

+0

c'è un bug in icCube :-(, è per questo che non funziona – ic3

1

AGGIORNAMENTO: La valutazione della tupla è un caso che abbiamo perso, il bug è stato risolto in icCube 4.2. Fai attenzione che usare la stessa gerarchia su una clausola where e su un asse è complicato. Di essi sia filtrati: "{[2010], [2011]} a 0 .. dove [2010] tornerà [2010], ma una tupla è evaluted senza filtraggio diverse gerarchie della stessa dimensione si applica il filtro autoexists

..

Poiché questo è un po 'complicato, abbiamo deciso di estendere SETS per consentire di dichiarare un set in una query che viene valutata con il contesto globale - senza tener conto dove clausola e sottointerrogazioni:

WITH 
-- always the same regardless of the where clause and subquery 
    STATIC SET [Global] Filter([Country].members, ([Measures].[Amount], [2010])>80000) 
.. 

La soluzione facile ed efficace è quella di andare come Frank sta proponendo, aggiungendo direttamente i paesi filtrati nell'asse

SELECT 
    // this will return the countries with sales amount bigger than 80'000 for [2010] 
    // e.g. { [USA], [UK] } ... [2010] is is just used for filterting 
    Filter([Country].members, ([Measures].[Amount], [2010])>80000) on 0, 
    // When evaluated we're going to use [2009] as it's the slicer default value 
    [Amount] on 1 
FROM [sales] 
WHERE [2009] 

Per quanto riguarda la query dovrebbe funzionare, sono d'accordo, è un bug in icCube che fisseremo al più presto (PTS). Nel frattempo si deve evitare di utilizzare la stessa gerarchia nella affettatrice e nella funzione filtro utilizzato in un'affettatrice, qualcosa come:

WITH 
MEMBER [Amount 2009] AS ([Amount],[2009]) 
SELECT 
    Filter([Country].members, ([Measures].[Amount], [2010])>80000) on 0, 
    [Amount 2009] on 1 
FROM [sales] 

Oppure si può passare a una versione che funziona in icCube (meno efficiente rispetto Frank uno):

SELECT [Country].members on 0, [Amount] on 1 
FROM (select Filter([Country].members, ([Measures].[Amount], [2010])>80000) on 0 from [sales]) 
WHERE [2009] 

Se stai giocando con il raggruppamento in base a diversi critierias è possibile utilizzare una nuova funzionalità icCube ha introdotto un paio di mesi fa: Categories

permettono di creare una gerarchia come membro di altro hierar Chies. Potresti definire quei paesi come [80000+] per eseguire successivamente calcoli basati su questa nuova classificazione.

+0

Si prega di precisare il luogo dove sto andando male, ma mi sembra che una soluzione senza una subquery è sbagliato pianura, perché l'ordine di valutazione della la query è: FROM, WHERE, SELECT (set, ecc.).Una volta che l'slicing nella clausola WHERE è stata eseguita (e quindi solo i dati relativi a [2009] sono rimasti nel cubo), non posso utilizzare un filtro su [2010] nella clausola SELECT. Vedi anche questo post: http://social.msdn.microsoft.com/Forums/sqlserver/en-US/cd980958-e443-444e-a176-9285d5080059/mdx-query-execution-and-context?forum=sqlanalysisservices – AlwaysLearning

+0

La clausola WHERE in MDX non è come un SQL, ma piuttosto come un modo per impostare i valori predefiniti. Quindi se nell'asse che hai messo [2010] userai la sovrascrittura [2010] [2009]. È quando si utilizza una sottoquery che si ottiene il comportamento come in una clausola WHERE SQL. È strano, ma è come funziona MDX – ic3

+0

Fino a quando non rilasciamo una nuova versione tra un paio di giorni, devi usare i set statici o la query con subselect (la seconda del mio post) – ic3

Problemi correlati