Pagina 2 di 2

Da Tabella a Misura

Inviato: sab 14 gen 2023, 16:41
da Andrea90
xalbex,

Se ti connetti in live no non credo tu possa perché in realtà non stai importando nulla in Pbi, se invece sei in. import mode puoi modificarlo.

Andrea

Da Tabella a Misura

Inviato: lun 23 gen 2023, 19:01
da xalbex
Ragazzi ritorno da voi perché sto impazzendo.
Forse non ho ancora ben capito le logiche di PowerBI e per questo mi confondo un pò.
Ho fatto miliardi di prove ma non riesco a risolvere il problema.
Parto dall'inizio.
Ho una tabella dei fatti - FactDPF - che ha questo aspetto:
.....
2021 | C1| D2 | P1 | 0,15
2021 | C1| D1 | P1 | 0,26
2022 | C1| D1 | P1 | 0,30
2022 | C1| D1 | P1 | 0,41
2022 | C1| D1 | P1 | 0,41

2022 | C1| D1 | P2 | 0,24
2022 | C1| D1 | P2 | 0,23
2022 | C1| D1 | P2 | 0,10

2023 | C1| D1 | P2 | 0,15
2023 | C1| D2 | P3 | 0,20
.....

C1 e D1 sono attributi Cliente, P1 e P2 relativi al prodotto, 2021, 2022, 2023 gli anni di riferimento, mentre i numeri le quantità di Ordinato.

Creo una misura utilizzando questo codice:

Codice: Seleziona tutto

#Righe= 
CALCULATE(
    COUNTROWS(
        SUMMARIZE(
            FactDPF,
            FactDPF[Anno],
            FactDPF[Cliente],
            FactDPF[Deposito],
            FactDPF[Prodotto]
        )
    ),
    FactDPF[Anno] IN {2021,2022},
    FactDPF[Deposito] = "D1",
    FactDPF[Prodotto] IN {"P1", "P2"}
)
Il risultato che ottengo è #Righe = 3, come mi aspettavo.
Suppongo che SUMMARIZE restituisca una tabella di questo tipo:
2021 | C1| D1 | P1
2022 | C1| D1 | P1
2022 | C1| D1 | P2
Per cui il numero di righe è esattamente 3.

Se cambio il codice:

Codice: Seleziona tutto

MisuraORD= 
CALCULATE(
    SUMX(
        SUMMARIZE(
            FactDPF,
            FactDPF[Anno],
            FactDPF[Cliente],
            FactDPF[Deposito],
            FactDPF[Prodotto]
        ),
        SUM(FactDPF[Ordinato])
    ),
    FactDPF[Anno] IN {2021,2022},
    FactDPF[Deposito] = "D1",
    FactDPF[Prodotto] IN {"P1", "P2"}
)
Ottengo MisuraORD= 5,85 .
Da quello che penso di aver capito, una volta riassunta la tabella, viene calcolata per ciascuna riga la somma dell'ordinato totale (perché manca il RowContext).
Per cui si otterrebbe:
2021 | C1| D1 | P1 | 1,95
2022 | C1| D1 | P1 | 1,95
2022 | C1| D1 | P2 | 1,95
Infatti, 1,95 = 0,26 + 0,30 + 0,41 + 0,41 + 0,24 + 0,23 + 0,10.
Il SUMX restituisce la somma delle 3 righe che è appunto 5,85 (1,95 + 1,95 + 1,95).
Penso il sistema ragioni così perché se cambio SUMX in AVERAGEX ottengo SommaORD = 1,95 , ovvero (1,95 + 1,95 + 1,95) / 3.

Ma come faccio a dire al sistema di calcolarmi per ciascuna riga della tabella riassunta la somma legata al contesto della riga stessa?
Per intenderci, come faccio ad avere una cosa di questo tipo:
2021 | C1| D1 | P1 | 0,26
2022 | C1| D1 | P1 | 1,12 (0,3 + 0,41 + 0,41)
2022 | C1| D1 | P2 | 0,57 (0,24 + 0,23 + 0,10)
Per poi ottenere MisuraORD= 1,95 con SUMX o MisuraORD= 0,65 con AVERAGEX?????????

Ho provato ad inserire ADDCOLUMNS in questo modo:

Codice: Seleziona tutto

MisuraORD= 
CALCULATE(
    SUMX(
    	ADDCOLUMNS(
        	SUMMARIZE(
            		FactDPF,
            		FactDPF[Anno],
           		FactDPF[Cliente],
            		FactDPF[Deposito],
            		FactDPF[Prodotto]
        	),
        	"SommaORD", SUM(FactDPF[Ordinato])
        )
    ), [SommaORD]
    FactDPF[Anno] IN {2021,2022},
    FactDPF[Deposito] = "D1",
    FactDPF[Prodotto] IN {"P1", "P2"}
)
Ma ottengo sempre MisuraORD= 5,85 con SUMX o MisuraORD= 1,95 con AVERAGEX.

Mi sto davvero perdendo...HELP!
:crazy:
Grazie.

Da Tabella a Misura

Inviato: lun 23 gen 2023, 19:07
da Andrea90
xalbex,

Prova questa per la somma:

Codice: Seleziona tutto

=
VAR TempTab =
    CALCULATETABLE (
        SUMMARIZE (
            FactDPF,
            FactDPF[Anno],
            FactDPF[Cliente],
            FactDPF[Deposito],
            FactDPF[Prodotto]
        ),
        FactDPF[Anno] IN { 2021, 2022 },
        FactDPF[Deposito] = "D1",
        FactDPF[Prodotto] IN { "P1", "P2" }
    )
VAR AddCol_Temp =
    ADDCOLUMNS ( TempTab, "@TotORD", CALCULATE ( SUM ( FactDPF[Ordinato] ) ) )
VAR Result =
    SUMX ( AddCol_Temp, [@TotORD] )
RETURN
    Result

Per la media sostituisci SUMX con AVERAGEX.

Se avrai altre domande da porre in futuro apri nuove discussioni, non accodarti nuovamente a questa.

Andrea

Da Tabella a Misura

Inviato: mar 24 gen 2023, 9:16
da Enrico Galli
Ciao. Andrea ha costruito la misura in modo diverso (e probabilmente più semplice da leggere e mantenere), ma volendo "sistemare" la tua versione, in particolare l'ultima con ADDCOLUMNS, direi che ti basta racchiudere dentro un CALCULATE l'operazione SUM(FactDPF[Ordinato]) :wave:

Da Tabella a Misura

Inviato: mar 24 gen 2023, 12:15
da xalbex
Andrea90 Andre grazie...avevo provato ad utilizzare VAR per renderla più leggibile, ma mi dava un errore.
Probabilmente avevo digitato qualcosa di sbagliato, però riguardandola più e più volte, non trovando l'errore, m'ero convinto fosse qualcosa relativo al funzionamento di DAX in PowerBI VS il funzionamento di DAX in SQL Server Management Studio (come guida per le varie funzioni utilizzavo il sito dax.guide...)
Indipendentemente da ciò, come diceva Enrico Galli, oltre a rendere più leggibile la mia misura, hai "semplicemente" aggiunto un CALCULATE.
Allora mi sono detto: ma cosa fa il CALCULATE che SUM non fa?
Nella mia testa CALCULATE serviva a filtrare dei valori E BASTA.
Invece riguardando la teoria relativa a CALCULATE proprio nel sito dax.guide, mi sono imbattuto in questo articolo:
https://www.sqlbi.com/articles/understa ... ransition/
In pratica si dice che CALCULATE oltre a filtrare, se applicato ad un contesto riga, permette la "context transition" che in pratica significa passare dal contesto riga al contesto filtro (cosa che SUM non fa).
Per cui Enrico Galli, grazie mille anche a te perché stamane avevo proprio modificato la misura inserendo CALCULATE davanti al SUM...
Da lì mi si è aperto un mondo e sto facendo mille prove.

GRAZIE MILLE!!!! :clap: :clap: :clap: :clap: :clap: :clap: :clap: :clap:

Da Tabella a Misura

Inviato: mar 24 gen 2023, 14:13
da Enrico Galli
Per dirla con le parole di Alberto Ferrari: "CALCULATE è la regina del DAX. E l'ho declinata volutamente al femminile, perché come per tutte le donne... non la si potrà mai capire fino in fondo" :lol: