Definisci dinamicamente un intervallo in una dimensione


18

Ho un problema che devo affrontare ogni volta che decido di costruire un cubo e non ho ancora trovato il modo di superarlo.

Il problema è come consentire all'utente di definire automaticamente una serie di cose senza la necessità di codificarle nella dimensione. Spiegherò il mio problema in un esempio.

Ho un tavolo chiamato Clienti :

Struttura della tabella

questi sono i dati nella tabella:

Tabella con dati

Voglio visualizzare i dati in uno stile pivot e raggruppare lo stipendio e l' età in intervalli definiti come di seguito:

Tabella con dati con intervallo definito

Ho scritto questo script e definito le gamme:

SELECT [CustId]
      ,[CustName]
      ,[Age]
      ,[Salary]
      ,[SalaryRange] = case
        when cast(salary as float) <= 500 then
            '0 - 500'
        when cast(salary as float) between 501 and 1000 then
            '501 - 1000'
        when cast(salary as float) between 1001 and 2000 then
            '1001 - 2000'
        when cast(salary as float) > 2000 then
            '2001+'
        end,
        [AgeRange] = case
        when cast(age as float) < 15 then
            'below 15'
        when cast(age as float) between 15 and 19 then
            '15 - 19'
        when cast(age as float) between 20 and 29 then
            '20 - 29'               
        when cast(age as float) between 30 and 39 then
            '30 - 39'
        when cast(age as float) >= 40 then
            '40+'
        end
  FROM [Customers]
GO

Le mie gamme sono codificate e definite. Quando copio i dati in Excel e li visualizzo in una tabella pivot, appare come di seguito:

Dati nella tabella pivot

Il mio problema è che voglio creare un cubo convertendo la tabella Clienti in una tabella dei fatti e creare 2 tabelle dimensionali SalaryDim & AgeDim .

La tabella SalaryDim ha 2 colonne ( SalaryKey, SalaryRange ) e la tabella AgeDim è simile ( ageKey, AgeRange ). La tabella dei fatti del mio cliente contiene:

Customer
[CustId]
[CustName]
[AgeKey] --> foreign Key to AgeDim
[Salarykey] --> foreign Key to SalaryDim

Devo ancora definire le mie gamme all'interno di queste dimensioni. Ogni volta che collego un pivot di Excel al mio cubo, riesco a vedere solo questi intervalli definiti codificati.

La mia domanda è come definire gli intervalli dinamicamente direttamente dalla tabella pivot, senza creare le dimensioni dell'intervallo come AgeDim e SalaryDim . Non voglio essere bloccato solo negli intervalli definiti nella dimensione.

Nessun intervallo definito

L'intervallo definito è '0-25', '26 -30 ', '31 - 50'. Potrei volerlo cambiare in '0-20', '21 -31 ', '32 -42' e così via, e gli utenti richiedono ogni volta intervalli diversi.

Ogni volta che lo cambio, devo cambiare la dimensione. Come posso migliorare questo processo?

Sarebbe bello avere una soluzione implementata nel cubo, in modo che qualunque strumento client BI che si connette al cubo possa definire gli intervalli, ma non mi dispiacerebbe se c'è un buon modo usando solo Excel.

Risposte:


12

COME FARE QUESTO CON T-SQL:

Come richiesto, questa è un'alternativa alla mia precedente risposta che mostrava come farlo per utente con Excel. Questa risposta mostra come fare la stessa cosa condivisa / centralmente usando invece T-SQL. Non so come fare cubi, MDX o roba SSAS per questo, quindi forse Benoit o qualcuno che sa che può pubblicare il suo equivalente ...

1. Aggiungi tabella e vista SalaryRanges SQL

Crea una nuova tabella chiamata "SalaryRangeData" con il seguente comando:

Create Table SalaryRangeData(MinVal INT Primary Key)

Aggiungi colonne calcolate avvolgendole in una vista con questo comando:

CREATE VIEW SalaryRanges As
WITH
  cteSequence As
(
    Select  MinVal,
            ROW_NUMBER() OVER(Order By MinVal ASC) As Sequence
    From    SalaryRangeData
)
SELECT 
    D.Sequence,
    D.MinVal,
    COALESCE(N.MinVal - 1, 2147483645)  As MaxVal,
    CAST(D.MinVal As Varchar(32))
    + COALESCE(' - ' + CAST(N.MinVal - 1 As Varchar(32)), '+')
                        As RangeVals
FROM        cteSequence As D 
LEFT JOIN   cteSequence As N ON N.Sequence = D.Sequence + 1

Fai clic con il tasto destro del mouse sulla tabella in SSMS e seleziona "Modifica le prime 200 righe". Quindi inserisci i seguenti valori nelle celle MinVal: 0, 501, 1001 e 2001 (l'ordine non ha importanza per SQL Server, lo creerà per noi). Chiudi l'editor delle righe della tabella ed esegui una SELECT * FROM SalaryRangesvisualizzazione per visualizzare tutte le righe e le informazioni sull'intervallo.

2. Aggiungi tabella e vista SQL AgeRanges

Esegui esattamente gli stessi passaggi del precedente punto 1, tranne per sostituire tutte le occorrenze di "Stipendio" con "Età". Questo dovrebbe rendere la tabella "AgeRangeData" e la vista "AgeRanges".

Immettere i seguenti valori nella colonna AgeRangeData [MinVal]: 0, 15, 20, 30 e 40.

3. Aggiungi intervalli ai dati

Sostituisci la tua istruzione SELECT con espressioni CASE per recuperare i dati e gli intervalli con il seguente:

SELECT [CustId]
      ,[CustName]
      ,[Age]
      ,[Salary]
      ,[SalaryRange] = (
            Select RangeVals From SalaryRanges
            Where [Salary] Between MinVal And MaxVal)
      ,[AgeRange] = (
            Select RangeVals From AgeRanges
            Where [Age] Between MinVal And MaxVal)
  FROM [Customers]

4. Tutto il resto, lo stesso di adesso

Da qui in poi, fai tutto allo stesso modo in cui sei attualmente. Gli intervalli devono essere visualizzati nella tabella pivot come fanno attualmente.

5. Prova la magia

Vai nuovamente all'editor di righe di tabella SalaryRangeData in SSMS ed elimina le righe esistenti, quindi inserisci i seguenti valori: 0, 101, 201, 301, ... 2001 (di nuovo, l'ordine non ha importanza per la soluzione T-SQL) . Torna alla tua tabella pivot e aggiorna i dati. E proprio come la soluzione Excel, gli intervalli di tabella pivot dovrebbero essere modificati automaticamente.


aggiunta

COME AGGIUNGERLO A UN CUBO:

1. Creare una vista

CREATE VIEW CustomerView As
SELECT [CustId]
      ,[CustName]
      ,[Age]
      ,[Salary]
      ,[SalaryRange] = (
            Select RangeVals From SalaryRanges
            Where [Salary] Between MinVal And MaxVal)
      ,[AgeRange] = (
            Select RangeVals From AgeRanges
            Where [Age] Between MinVal And MaxVal)
  FROM [Customers]

1. Creare un progetto BI in Visual Studio e aggiungere il CustomerView

Connettersi al database e aggiungere la CustomerViewvista nella Data Source Viewstabella Fatti

Viste dell'origine dati

2. Creare un cubo e definire Misura e dimensione

abbiamo solo bisogno di customerId, come misura per il conteggio dei clienti e avremo la stessa tabella dei fatti come dimensione

Le misure

Dimensioni

3. Aggiungi attributi alla dimensione

Aggiungi intervalli come Attributi alla Dimensione

4. Connettiti al cubo da Excel

Aggiungi origine SSAS a Excel

Seleziona il cubo

5. Visualizza i dati del cubo in Excel

Visualizza il cubo in Excel

6. per Eventuali modifiche negli intervalli è sufficiente rielaborare la dimensione e il cubo

se è necessario modificare gli intervalli, modificare i dati nella SalaryRangeDatae AgeRangeDatae poi basta rielaborare le dimensioni e il cubo


8

COME FARE QUESTO CON EXCEL

Ecco come lo farei in Excel ...

1. Aggiungi tabella Excel SalaryRanges

Inserisci un nuovo foglio di lavoro, chiamalo "Salary Ranges". Nella riga uno aggiungi le intestazioni di testo "Min", "Max" e "Range" in quell'ordine (dovrebbero essere rispettivamente le celle A1, A2, A3).

Nella cella B2 aggiungi la seguente formula:

=IF(A2="","",IF(A3="","+",A3-1))

Nella cella C2 aggiungi questa formula:

=IF(B2="","",A2 & IF(B2="+",""," - ") & B2)

Riempi automaticamente queste due formule lungo le colonne B e C per il numero massimo di righe di cui potresti mai aver bisogno (diciamo 30).

Quindi, selezionare l'intero intervallo (A1..C31). Vai alla scheda Inserisci e fai clic sul pulsante Tabella per modificare questo intervallo in una tabella di Excel (in precedenza denominata "Elenchi"). Nella scheda Progettazione strumenti tabella, modifica il nome di questa tabella in "SalaryRanges".

Ora, vai alla cella A2 nella colonna Min e inserisci "0", "501" in A3, "1001" nella cella A4 e infine "2001" nella cella A5. Si noti che mentre si esegue questa operazione, le colonne MAx e Range vengono compilate automaticamente.

2. Aggiungi tabella Excel AgeRanges

Ora crea un altro nuovo foglio di lavoro chiamato "Intervalli di età" e fai esattamente gli stessi passaggi del precedente numero 1, tranne che chiama questa tabella "Intervalli di età" e nella colonna Min riempi le celle da A2 ad A6 con 0, 15, 20, 30 e 40, in ordine. Ancora una volta, i valori Max e Range dovrebbero compilare automaticamente mentre procedi.

3. Ottieni i dati

Ottieni i dati dal database nella cartella di lavoro di Excel come hai fatto in precedenza (non creare ancora la tabella pivot, lo facciamo di seguito), tranne che dovresti rimuovere le colonne della funzione del caso AgeRange e SalaryRange.

4. Aggiungi le colonne Retribuzione e Fascia d'età ai tuoi dati

Nel foglio in cui si trovano i tuoi dati, aggiungi una colonna "SalaryRange" e "AgeRange". Nella colonna SalaryRange, compila automaticamente la seguente formula (presuppone che "D" sia la colonna Salary):

=LOOKUP(D2,SalaryRanges)

E riempi automaticamente questa formula nella colonna AgeRange (supponendo che "C" sia la colonna Age):

=LOOKUP(C2,AgeRanges)

5. Crea la tua tabella pivot

Fallo come hai fatto prima. Tieni presente che il valore / le etichette dell'intervallo di età e stipendio corrispondono agli intervalli scelti.

6. Prova la magia

Ora la parte divertente. Vai al foglio di lavoro SalaryRanges e inserisci nuovamente la colonna Min, iniziando da 0, quindi 101, 201, 301, ... 2001. Torna indietro alla tua tabella pivot e aggiornala. Shazaam!


Dovrei menzionare che ovviamente puoi anche ottenere lo stesso effetto inserendo le tabelle in SQL e modificando la tua istruzione SELECT per eseguire le LOOKUP (..) come subquery (un po 'disordinate a causa della corrispondenza degli intervalli, ma sicuramente grado). Il motivo per cui l'ho fatto in questo modo (in Excel) è

  1. La modifica degli intervalli è un po 'più semplice per la maggior parte delle persone. Anche per gli sviluppatori DBA e SQL (come noi), in questo modo è un po 'più semplice solo perché è più vicino all'interfaccia utente / ai risultati.
  2. Ciò consente ai tuoi utenti di modificare i propri intervalli senza doverti disturbare. (un GRANDE vantaggio nella mia vita)
  3. Ciò consente inoltre a ciascun utente di definire i propri intervalli.

Tuttavia, a volte non è desiderabile che gli utenti definiscano i propri intervalli. Se questo è il tuo caso, sarò felice di dimostrare come farlo centralmente, in SQL invece.


+1 e grazie mille la soluzione funziona in modo sorprendente, collegando la tabella con i dati con gli intervalli tutti in Excel, c'è un modo per collegare questi intervalli definiti con la tabella pivot che è collegata al cubo, i miei pivot sono direttamente collegati al cubo in SSAS, e sarebbe anche bello poter mostrare "come farlo centralmente".
AmmarR,

Posso mostrarti come farlo centralmente con le espressioni SQL, lo posterò come risposta alternativa. Non riesco a risolvere i problemi del cubo / SSAS perché purtroppo non li conosco. Sì, dovrei conoscerli e vorrei farlo, ma non lo so, quindi qualcun altro dovrà occuparsene.
RBarryYoung,

5

Con il linguaggio MDX è possibile creare membri personalizzati che definiranno gli intervalli. L'espressione seguente ha definito un membro calcolato che rappresenta tutti gli stipendi tra 501 e 1000:

MEMBER [Salary].[between_500_and_1000] AS Aggregate(Filter([Salary].Members, [Salary].CurrentMember.MemberValue > 500 AND [Salary].CurrentMember.MemberValue <= 1000))

Puoi fare la stessa cosa con la dimensione dell'età:

MEMBER [Age].[between_0_and_25] AS Aggregate(Filter([Age].Members, [Age].CurrentMember.MemberValue <= 25))

Questo articolo spiega come aggiungere questi membri calcolati in Excel (consultare la sezione " Creazione di membri / misure calcolati e set nella tabella pivot OLAP di Excel 2007 "). Purtroppo non esiste un'interfaccia utente in Excel per questo. Tuttavia, è possibile trovare client BI che supportano il linguaggio MDX , che consentono di definire i propri intervalli nelle query.


grazie @Benoit, sto provando ad aggiungere campi calcolati nel cubo stesso con lo stesso concetto che stai suggerendo ma non sembra ancora funzionare, il processo è un po 'lungo e non mi è familiare, lo proverò con Excel anche,
AmmarR

Grazie @RBarryYoung. @ MarkStorey-Smith: posso migliorare l'efficienza della formula, se mi dai l'elenco dei livelli presenti nella dimensione Salarye Age.
Benoit,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.