Media di categoria su ogni riga

Il software per la BI di Microsoft, leader nel mercato

Filippo.regina
Messaggi: 6 | Topic creati
Iscritto il: ven 22 apr 2022, 14:37
Contatta:

Media di categoria su ogni riga

Messaggio da Filippo.regina »

Buongiorno,
qualcuno saprebbe aiutarmi? :? :crazy:
ho una colonna con una variabile categorica (es. colore = giallo, blu, verde, ecc.)
e una colonna con una variabile numerica (es. prezzo)

Devo calcolare una colonna che mi dica, su ogni item, il prezzo medio della categoria di colore di cui fa parte.

Es.
Immagine 2022-05-16 170320.png
Immagine 2022-05-16 170320.png (5.58 KiB) Visto 194 volte


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:

Media di categoria su ogni riga

Messaggio da Enrico Galli »

Ciao. Qualcosa tipo
CALCULATE(AVERAGE(tabella[prezzo]); ALLEXCEPT(tabella[colore]))
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

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

Media di categoria su ogni riga

Messaggio da xalbex »

Ciao a tutti.
Enrico Galli mi collego a questo post perché reputo il quesito simile a quello affrontato.
Andrea90 Andre secondo me anche tu in questo argomento sei maestro e potresti venirmi in aiuto.

Trattasi di media con l'utilizzo delle funzioni di deconstestualizzazione (ALL, ALLSELECTED o ALLEXCEPT).
Vi incollo la misura:

Codice: Seleziona tutto

Avg = 
VAR TabellaRIF = 
CALCULATETABLE(
    ADDCOLUMNS(
        SUMMARIZE(
            Query_Dataset,
            Query_Dataset[[CP]]],
            Query_Dataset[Cliente[Nome1]]],
            Query_Dataset[Cliente[Nome2]]],
            Anagrafica[Item],
            Tempo[Anno.Mese]
        ),
        "Volumi", --'Inserendo questa colonna si evitano eventuali righe con Ordinato nullo.
        [Ordinato]
    ),
    Tempo[Anno] >= YEAR(NOW()) - 1,
    Query_Dataset[DimPromo[SellOutEnd]]] < NOW()
)

Var RES = 
AVERAGEX(
    TabellaRIF,
    [Volumi]
)

RETURN RES
A contorno:
  • [Ordinato] è una misura e non ha quindi bisogno di CALCULATE per utilizzare il contesto di riga introdotto da ADDCOLUMS
  • Query_Dataset è una tabella collegata a Tempo e Anagrafica (lato molti)
  • La misura funziona per lo scopo per il quale è stata pensata fintantoché la si utilizza in tabelle che non aggiungono "complessità" alla TabellaRIF così come sopra definita...in altre parole se ad esempio creo una tabella con i seguenti campi CP|Nome1|Nome2|Item|Anno.Mese e utilizzo la misura Avg tutto ok...se inserisco un campo che aumenta il numero di righe (che ne so il giorno), la misura non restituisce la media calcolata sul Mese, ma l'ordinato giornaliero (la cui media è inutile, dato che la granularità massima è appunto quella giornaliera).
Avevo pensato di calcolare "Volumi" sfruttando ALLEXCEPT come sotto:

Codice: Seleziona tutto

Avg = 
VAR TabellaRIF = 
CALCULATETABLE(
    ADDCOLUMNS(
        SUMMARIZE(
            Query_Dataset,
            Query_Dataset[[CP]]],
            Query_Dataset[Cliente[Nome1]]],
            Query_Dataset[Cliente[Nome2]]],
            Anagrafica[Item],
            Tempo[Anno.Mese]
        ),
        "Volumi", --'Inserendo questa colonna si evitano eventuali righe con Ordinato nullo.
        CALCULATE(
        	[Ordinato],
        	ALLEXCEPT(
        		Query_Dataset,
        		Query_Dataset[[CP]]],
        		Query_Dataset[Cliente[Nome1]]],
        		Query_Dataset[Cliente[Nome2]]],
        		Anagrafica[Item],
        		Tempo[Anno.Mese]
        	)
          ) 	
    ),
    Tempo[Anno] >= YEAR(NOW()) - 1,
    Query_Dataset[DimPromo[SellOutEnd]]] < NOW()
)

Var RES = 
AVERAGEX(
    TabellaRIF,
    [Volumi]
)

RETURN RES
Ma a parte la forma che assume il codice della misura (a mio parere confusionaria e ridondante) non risolvo il problema.
Voi avete idee?
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:

Media di categoria su ogni riga

Messaggio da Enrico Galli »

Ciao. [Ordinato] è una semplice SUM o aggiunge altri elementi di complessità?
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

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

Media di categoria su ogni riga

Messaggio da xalbex »

Semplice SUM.
Enrico Galli Enri ci ho lavorato tutto il giorno ieri...fatto mille prove ed ogni volta c'era qualcosa che non mi quadrava.
Ho provato a rifare un file con le sole info che servono a risolvere il problema che adesso ti allego.
Se hai tempo prova a dare un'occhiata.

Ti incollo il codice che mi sembra uno fra i più puliti (e INTUITIVI) che ho elaborato ieri:

Codice: Seleziona tutto

Stima = 
VAR Tabella = 
SUMMARIZE(
    data,
    data[Anno.Mese],
    data[ClienteNome],
    data[ClienteCognome],
    data[SI/NO],
    data[Codice]
)

VAR Volumi = 
AVERAGEX(
    Tabella,
    CALCULATE(
        SUM(
            data[Ordinato]
        )
    )
)

RETURN Volumi
Creando una tabella ottengo i risultati che posto in foto
Immagine

Il mio obiettivo è ottenere 4.89 sia al livello totale (e già la misura questo lo fa), sia per ciascuna delle righe della tabella (in cui invece sembra si contestualizzi per ID :crazy: )
Per ciascuna riga, infatti, poi mi servirà il valore "globale" 4.89 per fare ulteriori calcoli.

:idea: ?
Voglio dire non dovrebbe essere complicato ma mi sto impappinando :geek:
data.pbix
(30.3 KiB) Scaricato 7 volte
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:

Media di categoria su ogni riga

Messaggio da Enrico Galli »

Allora, scusa ma l'esempio che hai mandato non credo proprio possa aiutare: torniamo al tuo codice originale.
Se capisco bene, Ordinato = SUM (Query_Dataset[Ordinato] ), supporrò che sia così.
Ora, non è che sia SEMPRE necessario fare delle tabelle raggruppate all'interno delle misure... tu nel tuo report hai già un contesto di filtro, per cui la misura viene filtrata automaticamente in ciascuna cella della tabella in cui viene calcolata. Se tu vuoi ignorare tutti i filtri più granulari o diversi rispetto al set che hai definito, io proverei con:

Codice: Seleziona tutto

Avg = 
CALCULATE ( 
	AVERAGE ( Query_Dataset[Ordinato] ),
	ALLEXCEPT(Anagrafica, Anagrafica[Item]),
	ALLEXCEPT(Tempo, Tempo[Anno.Mese]),
	Tempo[Anno] >= YEAR(NOW()) - 1,
	Query_Dataset[DimPromo[SellOutEnd]]] < NOW()
)
e nulla 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

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

Media di categoria su ogni riga

Messaggio da xalbex »

Ciao Enri.
Provo a insistere sul file che t'ho mandato perché allo scopo di spiegare il problema è molto intuitivo.
Adatto la tua formula nel file:

Codice: Seleziona tutto

Stima = 
CALCULATE(
    AVERAGE(
        data[Ordinato]
    ),
    ALLEXCEPT(
        data,
        data[ClienteNome],
        data[ClienteCognome],
        data[SI/NO],
        data[Codice]
    )
)
Che porterebbe a questo risultato:
Immagine

Che mi risolve il fatto di avere replicato il valore "globale" in ciascuna riga della tabella, ma restituisce un valore (2.22) che non è ciò che cerco di ottenere.
Scritta così, infatti, la misura Stima calcola la media di tutti i valori di Ordinato, ovvero:
(5.30 + 0.11 + ... + 3.32) / 11.

Invece, ciò che vorrei è una misura che calcoli la media per ciascun "blocco" di Anno.Mese.
Per intenderci, dovrebbe fare la media di questi valori:
Immagine

che è appunto 4.89 come nella misura che ti riportavo nel post precedente:

Codice: Seleziona tutto

Stima = 
VAR Tabella = 
SUMMARIZE(
    data,
    data[Anno.Mese],
    data[ClienteNome],
    data[ClienteCognome],
    data[SI/NO],
    data[Codice]
)

VAR Volumi = 
AVERAGEX(
    Tabella,
    CALCULATE(
        SUM(
            data[Ordinato]
        )
    )
)

RETURN Volumi
Il problema è che 4.89 non viene poi riportato nella tabella con gli ID:
Immagine


Non so se sono riuscito a spiegare bene...
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:

Media di categoria su ogni riga

Messaggio da Enrico Galli »

Non viene restituito perché ID fa parte del contesto di ciascuna cella, e SUMMARIZE non sovrascrive il contesto di filtro.

Questo per ottenere il risultato atteso nel file di test, ma ho grossi dubbi che possa essere riportato a quello vero, e che sia davvero ciò che ti occorre:

Codice: Seleziona tutto

Stima = 
VAR Tabella = 
SUMMARIZE(
    ALL(data),
    data[Anno.Mese],
    data[ClienteNome],
    data[ClienteCognome],
    data[SI/NO],
    data[Codice]
)

VAR Volumi = 
AVERAGEX(
    Tabella,
    CALCULATE(
        SUM(data[Ordinato]),
        REMOVEFILTERS(data[ID])
    )
)

RETURN Volumi
	
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

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

Media di categoria su ogni riga

Messaggio da xalbex »

Ho provato Enri.
Cola REMOVEFILTERS stesso risultato.
4.89 calcolo corretto, ma nada per la replica sulle varie righe:
Immagine
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:

Media di categoria su ogni riga

Messaggio da Enrico Galli »

Hai dimenticato ALL nel SUMMARIZE
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
Rispondi