Domanda

Ho bisogno di una query MDX che restituisce la parte superiore N per cento delle righe sulla base di una somma cumulativa di una misura. La parte difficile è che l'insieme deve essere ordinato sulla base di una misura diversa da quella utilizzata per la somma, in modo da utilizzare la funzione TopPercent non è possibile.

Per chiarire che cosa ho bisogno, ecco un esempio. Voglio comprare almeno 1000 grammi di carne nel minor numero di pacchetti possibili. Tuttavia, non è solo il peso del pacchetto, voglio la qualità, quindi voglio prodotti priorità ai che contengono la più alta percentuale di carne. I prodotti disponibili sono i seguenti:

|| Name      || Weight || PercentageOfMeat ||
| Product 1  | 500     |  20               |
| Product 2  | 250     |  60               |
| Product 3  | 1000    |  25               |
| Product 4  | 400     |  50               |
| Product 5  | 400     |  40               |

Quindi, per ottenere ciò che voglio, vorrei Ordina in modo discendente da PercentageOfMeat per soddisfare la mia prima priorità. Poi vorrei sommare i pesi dei prodotti cumulativamente fino a raggiungere il limite di 1000 grammi. Il risultato dovrebbe essere prodotto 2, 4 e del prodotto del prodotto 5. Questo è abbastanza semplice.

Ma è possibile farlo in MDX? TopPercent (o, nel caso dell'esempio, TopSum) sarebbe altrimenti perfetto, ma non mi permette di utilizzare misure diverse per l'ordinamento e somma. Se volevo solo i prodotti che il peso di più, che avrebbe funzionato. Per citare la documentazione, la funzione:

  

Ordina una serie in ordine decrescente, e ritorna un insieme di tuple con valori più elevati cui totale cumulativo è uguale o maggiore di una percentuale specificata.

Quello che fondamentalmente bisogno è la funzione TopPercent che non fa specie il set, ma per quanto ne so, non c'è nessuno. Così è possibile fare ciò che voglio o devo calcolare questo nel codice del server?

È stato utile?

Soluzione

Come sulla combinazione di un Ordine () prima di ottenere i vostri prodotti ordinati in base alla loro percentuale di carne e poi Filter () in base al loro peso cumulativo?

In [Adventure Works] il seguente codice è che mostra le mountain bike più ordinate le cui vendite cumulative importo è inferiore ad un certo valore:

with 

   set [mbikes] as order( [Product].[Product Categories].[mountain bikes].children, [order count], BDESC ) 

select 

    { [order count], [sales amount] } on 0,

    filter( [mbikes], sum( subset( [mbikes], 0, [mbikes].currentOrdinal ), [sales amount] ) < (8 * 1000 * 1000)  ) on 1 

from [adventure works]  

dando la seguente:

                          Order Count    Sales Amount
Mountain-200 Black, 38          743      $2,589,363.78
Mountain-200 Black, 42          671      $2,265,485.38
Mountain-200 Silver, 38         641      $2,160,981.60
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top