Da Tabella a Misura L’argomento è risolto

Il software per la BI di Microsoft, leader nel mercato
Avatar utente

xalbex
Messaggi: 41 | Topic creati
Iscritto il: dom 30 ott 2022, 11:07
Luogo: Parma
Ringraziato: 4 volte

Da Tabella a Misura

Messaggio da xalbex »

Ciao ragazzi,
Vi posto prima il codice di una MISURA, poi mi appello alla vostra esperienza ponendovi una domanda.
Premetto che i collegamenti tra le varie tabelle sono corretti.

Codice: Seleziona tutto

AVG= SUMX(
    CALCULATETABLE(
        SUMMARIZECOLUMNS(
            DimCliente[NomeCliente],
            "Ordinato", SUM(Database[Ordinato]),
            "#Ordini", DISTINCTCOUNT(Database[IDOrdine])
        ),
    DimTempo[Year] = 2022,
    ),
    DIVIDE([Ordinato], [#Ordini])
)
Domanda 1
E' corretto dire che con questa misura sto dicendo a PowerBI: Definita la tabella NomeCliente | Ordinato | #Ordini, filtra tutti gli ordini che si riferiscono al 2022, quindi per ciascuna riga di questa tabella calcola la media di ciascun ordine (mediante Ordinato / #Ordini), quindi (quando utilizzerò la misura in un report qualsiasi) restituiscimi la somma (in base al contesto che creo col suddetto report???

Domanda 2
Perché all'atto di creazione della misura non riscontro nessun errore di sintassi, mentre mi viene restituito l'errore "Non è possibile SummurizeColumns() e AddMissingItems() in questo contesto"???

Termino dicendovi che la TABELLA seguente viene correttamente creata e restituisce i risultati che mi aspetto.

Codice: Seleziona tutto

CALCULATETABLE(
    SUMMARIZECOLUMNS(
        DimCliente[NomeCliente],
        "Ordinato", SUM(Database[Ordinato]),
        "#Ordini", DISTINCTCOUNT(Database[IDOrdine]),
        "AVG", SUM(Database[Ordinato]) / DISTINCTCOUNT(Database[IDOrdine])
    ),
    DimTempo[Year] = 2022
)

Grazie per il vostro tempo.
Alberto.


Avatar utente

Enrico Galli
Messaggi: 890 | Topic creati
Iscritto il: dom 28 giu 2020, 19:03
Luogo: San Giovanni in Persiceto (BO)
Ringraziato: 325 volte
Contatta:

Da Tabella a Misura

Messaggio da Enrico Galli »

E se invece la scrivi così?

Codice: Seleziona tutto

AVG =
CALCULATE (
    SUMX (
        ADDCOLUMNS (
            VALUES ( DimCliente[NomeCliente] ),
            "Ordinato", SUM ( Database[Ordinato] ),
            "#Ordini", DISTINCTCOUNT ( Database[IDOrdine] )
        ),
        DIVIDE ( [Ordinato], [#Ordini] )
    ),
    DimTempo[Year] = 2022
)
Enrico Galli
Link utili: I nostri tutorial | Come inserire: Immagini - Codice - Risolto
Se il forum ti è stato utile, considera di supportarlo con una libera donazione
Avatar utente

Autore del topic
xalbex
Messaggi: 41 | Topic creati
Iscritto il: dom 30 ott 2022, 11:07
Luogo: Parma
Ringraziato: 4 volte

Da Tabella a Misura

Messaggio da xalbex »

Ciao Enri, ADDCOLUMNS vuole come primo parametro una tabella..per questo utilizzi VALUES per trasformare la colonna [NomeCliente]…corretto?

E se ti dicessi che oltre a quella colonna me ne servono altre 4 di tabelle diverse e che per semplicità le avevo omesse dal codice postato?
Non ci servirebbe comunque utilizzare SUMMARIZEDCOLUMNS?

Giorni fa avevo utilizzato SUMMARIZE..un pò sulla scia di come hai fatto tu..
Solo che un vincolo di SUMMARIZE è che una volta indicata la tabella di input (come primo argomento) tutte le altre colonne devono riferirsi ad essa..
Per questo avevo abbandonato questa funzione..
Avatar utente

Enrico Galli
Messaggi: 890 | Topic creati
Iscritto il: dom 28 giu 2020, 19:03
Luogo: San Giovanni in Persiceto (BO)
Ringraziato: 325 volte
Contatta:

Da Tabella a Misura

Messaggio da Enrico Galli »

xalbex ha scritto: mer 11 gen 2023, 18:02 Ciao Enri, ADDCOLUMNS vuole come primo parametro una tabella..per questo utilizzi VALUES per trasformare la colonna [NomeCliente]…corretto?
Corretto: VALUES([campo]) è l'equivalente di SUMMARIZE(tabella[campo])
E se ti dicessi che oltre a quella colonna me ne servono altre 4 di tabelle diverse e che per semplicità le avevo omesse dal codice postato?
Non ci servirebbe comunque utilizzare SUMMARIZEDCOLUMNS?
Non corretto: puoi utilizzare SUMMARIZE
Giorni fa avevo utilizzato SUMMARIZE..un pò sulla scia di come hai fatto tu..
Solo che un vincolo di SUMMARIZE è che una volta indicata la tabella di input (come primo argomento) tutte le altre colonne devono riferirsi ad essa..
Per questo avevo abbandonato questa funzione..
Non corretto: puoi richiamare campi da tutte le tabelle in relazione con la tabella di input

Personalmente, non ho mai utilizzato SUMMARIZECOLUMNS. Forse perché non la so usare, ma mi sono fatto l'idea che serva solo nelle query (quindi in strumenti come DAX Studio, o in ambienti dove si fanno girare delle query in DAX), e non sia mai indispensabile nelle misure di un report. Anzi, forse crea proprio dei problemi in più
Enrico Galli
Link utili: I nostri tutorial | Come inserire: Immagini - Codice - Risolto
Se il forum ti è stato utile, considera di supportarlo con una libera donazione
Avatar utente

Andrea90
Messaggi: 2193 | Topic creati
Iscritto il: dom 28 giu 2020, 19:41
Luogo: Bologna
Ringraziato: 666 volte
Contatta:

Da Tabella a Misura

Messaggio da Andrea90 »

xalbex,

Giusto per completezza, SUMMARIZECOLUMNS è una funzione che di base è molto ottimizzata rispetto alla combinazione classica ADDCOLUMNS() + SUMMARIZE().

Ha però diversi aspetti da tenere a mente:

1) Al contrario di SUMMARIZE non necessita di inserire come primo argomento la tabella di riferimento, perché quello che fa è una sorta di CROSSJOIN tra tutti i campi che inserisci al suo interno. Questo però comporta che potresti avere delle combinazioni che in realtà non esistono. Ad esempio se prendiamo una combinazione [Cliente] [Prodotto] lui ti mostrerebbe tutte le combinazioni esistenti (nel contesto valutativo di riferimento) dei campi indicati, ma non è detto che nella tua tabella dei fatti (magari quella degli ordini di vendita) esistano effettivamente tutte le combinazioni. Ecco che per ottimizzare la cosa, come parametro opzionale, puoi andare ad indicare la tabella filtro da applicare (come in SUMMARIZE quando indichi la tabella come primo argomento).

2) SUMMARIZECOLUMNS, al contrario di SUMMARIZE, fornisce solo un contesto filtro, e non un contesto riga, all'interno dell'espressione che utilizzerai. Quindi se tu scrivi una formula come questa:

Codice: Seleziona tutto

SUMMARIZE (
    Sales,
    'Date'[Year],
    "Test",
    VAR CurYear= 'Date'[Year], ....
La cosa funziona, perché il raggruppamento che fai per anno tiene sia il contesto filtro che quello riga (ho utilizzato SUMMARIZE), mentre se scrivo cosi:

Codice: Seleziona tutto

SUMMARIZECOLUMNS (
    'Date'[Year],
    "Test",
    VAR CurYear= 'Date'[Year], ....
Non funzionerebbe, perché 'Date'[Year] richiama l'utilizzo di un contesto riga che non hai, dovresti in questo caso utilizzare VALUES('Date'[Year]).

3) SUMMARIZECOLUMNS non lavora bene con il Context Transition. Quindi è difficile da utilizzare all'interno di misure. Faccio un esempio, la stessa misura scritta con SUMMARIZECOLUMNS magari funziona se la inserisci all'interno di un oggetto visivo come le "Card", ma se la stessa misura la inserisci dentro ad un oggetto visivo come una tabella, dove sulle righe hai un altro campo del modello, il sistema genererà quell'errore che vedi.

Ad esempio la seguente formula:

Codice: Seleziona tutto

Test_Summarize =
SUMX (
    ADDCOLUMNS (
        SUMMARIZE ( Sales, Customer[Country], 'Product'[Color] ),
        "@Sales", [Sales Amount]
    ),
    [@Sales]
)
Funziona sia con le Card che con tabelle dove suddividi il dato per un altro campo del modello, mentre questa:

Codice: Seleziona tutto

Test_SummarizeCol =
SUMX (
    SUMMARIZECOLUMNS (
        Customer[Country],
        'Product'[Color],
        "@Sales", [Sales Amount]
    ),
    [@Sales]
)
Funziona solo sulle Card, mentre in oggetti tabella riporterebbe lo stesso errore che hai mostrato tu.

4) Credo che ad oggi, non sia sempre supportato l'utilizzo di SUMMARIZECOLUMNS all'interno di contesti filtro modificati, come quello che hai creato tu inserendo quel SUMMARIZECOLUMNS all'interno di un CALCULATETABLE().

Andrea
Se hai gradito l'aiuto che hai ricevuto considera di contribuire alle spese per il mantenimento del forum facendo una libera DONAZIONE --> Link

Ricordarsi di segnare come "RISOLTE" le discussioni per le quali si è ricevuto un feedback positivo. Per vedere come fare --> Link
Avatar utente

Enrico Galli
Messaggi: 890 | Topic creati
Iscritto il: dom 28 giu 2020, 19:03
Luogo: San Giovanni in Persiceto (BO)
Ringraziato: 325 volte
Contatta:

Da Tabella a Misura

Messaggio da Enrico Galli »

Andrea90: il nostro ChatGPT vivente! :lol:
Enrico Galli
Link utili: I nostri tutorial | Come inserire: Immagini - Codice - Risolto
Se il forum ti è stato utile, considera di supportarlo con una libera donazione
Avatar utente

Andrea90
Messaggi: 2193 | Topic creati
Iscritto il: dom 28 giu 2020, 19:41
Luogo: Bologna
Ringraziato: 666 volte
Contatta:

Da Tabella a Misura

Messaggio da Andrea90 »

Enrico Galli ha scritto: gio 12 gen 2023, 11:27 Andrea90: il nostro ChatGPT vivente! :lol:
:lol: :lol: :lol:
Se hai gradito l'aiuto che hai ricevuto considera di contribuire alle spese per il mantenimento del forum facendo una libera DONAZIONE --> Link

Ricordarsi di segnare come "RISOLTE" le discussioni per le quali si è ricevuto un feedback positivo. Per vedere come fare --> Link
Avatar utente

Autore del topic
xalbex
Messaggi: 41 | Topic creati
Iscritto il: dom 30 ott 2022, 11:07
Luogo: Parma
Ringraziato: 4 volte

SUMMARIZE o SUMMARIZECOLUMNS

Messaggio da xalbex »

Il bello di forum come questo è che cerchi una soluzione, trovi cultura.
Grazie Andrea90 per la super spiegazione..avevo letto in giro queste differenze, ma ci avevo capito poco.
La tua spiegazione è molto chiara, anche se l’argomento è piuttosto complicato e mi ha fatto piacere averlo sollevato anche per altri utenti che si troveranno nello stesso problema.
Anzi mi permetto di cambiare il titolo della discussione.
Grazie anche a Enrico Galli alla fine considerati i vostri consigli ho risolto con CALCULATE e SUMMARIZE anche perché l’obiettivo è creare una misura…

A proposito, se la tabella dei fatti nativa del modello dati è eccessivamente complessa o ha un sacco di info che per lo scopo del progetto sono “inutili”, secondo voi, creare una tabella dei fatti con SUMMARIZECOLUMNS e collegarla alle altre tabelle DIM del modello dati e poi lavorare sulla nuova tabella…come approccio potrebbe portare a dei benefici?
Ci sono rischi?
Devo provare, ma magari voi che avete più esperienza ci siete già passati…

Grazie.
Alberto.
Avatar utente

Andrea90
Messaggi: 2193 | Topic creati
Iscritto il: dom 28 giu 2020, 19:41
Luogo: Bologna
Ringraziato: 666 volte
Contatta:

Da Tabella a Misura

Messaggio da Andrea90 »

xalbex,

Su come cercare di ottimizzare il modello ci sarebbe da discutere per qualche ora…. In generale posso dirti che se ci sono campi che non servono all’analisi questi vanno rimossi, idem se il livello di dettaglio delle tabelle è troppo elevato fai bene ad accorparle.

Quello che non capisco è perché usare Summarizecolumns (tabella calcolata), con tutti i problemi che hanno in termini di performance, piuttosto che ridurre le dimensioni della tabella direttamente a monte (ad esempio in sql se l’origine dati lo consente) o tramite Power Query.

Andrea
Se hai gradito l'aiuto che hai ricevuto considera di contribuire alle spese per il mantenimento del forum facendo una libera DONAZIONE --> Link

Ricordarsi di segnare come "RISOLTE" le discussioni per le quali si è ricevuto un feedback positivo. Per vedere come fare --> Link
Avatar utente

Autore del topic
xalbex
Messaggi: 41 | Topic creati
Iscritto il: dom 30 ott 2022, 11:07
Luogo: Parma
Ringraziato: 4 volte

Da Tabella a Misura

Messaggio da xalbex »

E’ un db gestito tramite Analisys service…non riesco ad eliminare una colonna da una tabella…o almeno così m’era sembrato tempo fa….devo riprovarci…intanto grazie mille vi faccio sapere…
Rispondi