Order (MDX)
Organizza i membri del set specificato e, facoltativamente, rispetta o meno la gerarchia.
Sintassi
Numeric expression syntax
Order(Set_Expression, Numeric_Expression
[ , { ASC | DESC | BASC | BDESC } ] )
String expression syntax
Order(Set_Expression, String_Expression
[ , { ASC | DESC | BASC | BDESC } ] )
Argomenti
Set_Expression
Espressione MDX (Multidimensional Expression) valida che restituisce un set.Numeric_Expression
Espressione numerica valida che in genere è un'espressione MDX (Multidimensional Expression) di coordinate di celle che restituisce un numero.String_Expression
Espressione stringa valida che in genere è un'espressione MDX (Multidimensional Expression) di coordinate di celle che restituisce un numero espresso come stringa.
Osservazioni
La funzione Order può essere di tipo gerarchico, come specificato dal flag ASC o DESC, oppure non gerarchico, come specificato dal flag BASC o BDESC . Il flag B significa "non rispettare la gerarchia"). Se si specifica il flag ASC o DESC, la funzione Order ordina prima i membri in base alla rispettiva posizione nella gerarchia e quindi ogni singolo livello. Se si specifica il flag BASC o BDESC, la funzione Order dispone i membri del set indipendentemente dalla gerarchia. Se non si specifica alcun flag, per impostazione predefinita viene utilizzato ASC.
Se la funzione Order viene utilizzata con un set in cui sono presenti due o più gerarchie a cui è stato applicato il cross join e se viene utilizzato il flag DESC, vengono ordinati solo i membri dell'ultima gerarchia del set. Questa situazione rappresenta una modifica rispetto ad Analysis Services 2000 in cui tutte le gerarchie del set sono ordinate.
Esempi
L'esempio seguente restituisce, dal cubo Adventure Works, il numero di ordini dei rivenditori per tutti gli elementi Calendar Quarters dalla gerarchia Calendar nella dimensione Date.La funzione Order riordina il set per l'asse ROWS. La funzione Order dispone il set in base al valore [Reseller Order Count] in ordine gerarchico discendente come stabilito dalla gerarchia [Calendar].
SELECT
Measures.[Reseller Order Count] ON COLUMNS,
Order(
[Date].[Calendar].[Calendar Quarter].MEMBERS
,Measures.[Reseller Order Count]
,DESC
) ON ROWS
FROM [Adventure Works]
Si noti che in questo esempio, quando il flag DESC viene impostato su BDESC, la gerarchia viene interrotta e l'elenco di elementi Calendar Quarters viene restituito indipendentemente dalla gerarchia:
SELECT
Measures.[Reseller Order Count] ON COLUMNS,
Order(
[Date].[Calendar].[Calendar Quarter].MEMBERS
,Measures.[Reseller Order Count]
,BDESC
) ON ROWS
FROM [Adventure Works]
Nell'esempio seguente viene restituita la misura Reseller Sales per le cinque sottocategorie di prodotti più vendute, indipendentemente dalla gerarchia, in base a Reseller Gross Profit. È possibile utilizzare la funzione Subset per restituire solo le prime cinque tuple dopo l'ordinamento del risultato mediante la funzione Order.
SELECT Subset
(Order
([Product].[Product Categories].[SubCategory].members
,[Measures].[Reseller Gross Profit]
,BDESC
)
,0
,5
) ON 0
FROM [Adventure Works]
Nell'esempio seguente viene utilizzata la funzione Rank per assegnare un rango ai membri della gerarchia City in base alla misura Reseller Sales Amount e quindi vengono visualizzati tali membri in ordine di rango. Utilizzando la funzione Order per ordinare il set dei membri della gerarchia City, l'ordinamento viene eseguito una sola volta ed è seguito da un'analisi lineare prima di essere visualizzato in modo ordinato.
WITH
SET OrderedCities AS Order
([Geography].[City].[City].members
, [Measures].[Reseller Sales Amount], BDESC
)
MEMBER [Measures].[City Rank] AS Rank
([Geography].[City].CurrentMember, OrderedCities)
SELECT {[Measures].[City Rank],[Measures].[Reseller Sales Amount]} ON 0
,Order
([Geography].[City].[City].MEMBERS
,[City Rank], ASC)
ON 1
FROM [Adventure Works]
Nell'esempio seguente viene restituito il numero dei prodotti unici contenuti nel set, utilizzando la funzione Order per ordinare le tuple non vuote prima di applicare la funzione Filter. La funzione CurrentOrdinal consente di confrontare ed eliminare i valori equivalenti.
WITH MEMBER [Measures].[PrdTies] AS Count
(Filter
(Order
(NonEmpty
([Product].[Product].[Product].Members
, {[Measures].[Reseller Order Quantity]}
)
, [Measures].[Reseller Order Quantity]
, BDESC
) AS OrdPrds
, (OrdPrds.CurrentOrdinal < OrdPrds.Count
AND [Measures].[Reseller Order Quantity] =
( [Measures].[Reseller Order Quantity]
, OrdPrds.Item
(OrdPrds.CurrentOrdinal
)
)
)
OR (OrdPrds.CurrentOrdinal > 1
AND [Measures].[Reseller Order Quantity] =
([Measures].[Reseller Order Quantity]
, OrdPrds.Item
(OrdPrds.CurrentOrdinal-2)
)
)
)
)
SELECT {[Measures].[PrdTies]} ON 0
FROM [Adventure Works]
Per comprendere il funzionamento del flag DESC con i set di tuple, considerare innanzitutto i risultati della query seguente:
SELECT
{[Measures].[Tax Amount]} ON 0,
ORDER(
[Sales Territory].[Sales Territory].[Group].MEMBERS
,[Measures].[Tax Amount], DESC)
ON 1
FROM [Adventure Works]
Sull'asse delle righe si nota che gli elementi Sales Territory Groups sono stati ordinati in ordine discendente in base al valore Tax Amount come indicato di seguito, ovvero North America, Europe, Pacific, NA. Osservare le modifiche se si esegue il cross join del set di Sales Territory Groups con il set di Product Subcategories e si applica la funzione Order in modo analogo, come indicato di seguito:
SELECT
{[Measures].[Tax Amount]} ON 0,
ORDER(
[Sales Territory].[Sales Territory].[Group].MEMBERS
{[Product].[Product Categories].[subCategory].Members}
,[Measures].[Tax Amount], DESC)
ON 1
FROM [Adventure Works]
Mentre il set Product Subcategories è stato ordinato in modo gerarchico decrescente, gli elementi Sales Territory Groups attualmente non sono ordinati e vengono visualizzati nello stesso ordine in cui sono presenti nella gerarchia, ovvero Europe, NA, North America e Pacific. Questa situazione si verifica perché solo l'ultima gerarchia del set di tuple, ovvero Product Subcategories, è ordinata. Per riprodurre il comportamento di Analysis Services 2000, utilizzare una serie di funzioni Generate nidificate per ordinare ogni set prima che venga applicato il cross join, come indicato di seguito:
SELECT
{[Measures].[Tax Amount]} ON 0,
GENERATE(
ORDER(
[Sales Territory].[Sales Territory].[Group].MEMBERS
,[Measures].[Tax Amount], DESC)
,
ORDER(
[Sales Territory].[Sales Territory].CURRENTMEMBER
{[Product].[Product Categories].[subCategory].Members}
,[Measures].[Tax Amount], DESC))
ON 1
FROM [Adventure Works]