Pagina 1 di 2

Da Tabella a Misura

Inviato: mer 11 gen 2023, 16:56
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.

Da Tabella a Misura

Inviato: mer 11 gen 2023, 17:32
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
)

Da Tabella a Misura

Inviato: mer 11 gen 2023, 18:02
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..

Da Tabella a Misura

Inviato: mer 11 gen 2023, 18:05
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ù

Da Tabella a Misura

Inviato: gio 12 gen 2023, 9:00
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

Da Tabella a Misura

Inviato: gio 12 gen 2023, 11:27
da Enrico Galli
Andrea90: il nostro ChatGPT vivente! :lol:

Da Tabella a Misura

Inviato: gio 12 gen 2023, 11:29
da Andrea90
Enrico Galli ha scritto: gio 12 gen 2023, 11:27 Andrea90: il nostro ChatGPT vivente! :lol:
:lol: :lol: :lol:

SUMMARIZE o SUMMARIZECOLUMNS

Inviato: sab 14 gen 2023, 16:00
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.

Da Tabella a Misura

Inviato: sab 14 gen 2023, 16:28
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

Da Tabella a Misura

Inviato: sab 14 gen 2023, 16:32
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…