Lezione 3.3
Trasformazioni avanzate
Modulo 03 · Lezione 3.3 · Livello Base

Trasformazioni intermedie: unpivot, Group By, colonne condizionali

Le tre trasformazioni che separano l'analista junior dal senior. Unpivot per trasformare dati "wide" in "long" (essenziale per modellare), Group By per aggregare, colonne condizionali per logica derivata.

  • ⏱ Tempo stimato: ~30 min + esercizi
  • 🎯 Prerequisiti: L3.1, L3.2
  • 🛠 Software: Power BI Desktop
1

Unpivot — da dati 'wide' a dati 'long'

Excel adora i dati wide (una colonna per ogni mese). Power BI ama i dati long (una colonna "Mese", una colonna "Valore"). L'unpivotè la trasformazione che ti porta dalla forma wide alla forma long.

Esempio. Hai una tabella così (wide):

Wide format
Prodotto | Gen | Feb | Mar | Apr
P001     | 100 | 120 | 90  | 150
P002     | 50  | 80  | 75  | 100

Dopo l'unpivot delle colonne mese diventa:

Long format
Prodotto | Mese | Valore
P001     | Gen  | 100
P001     | Feb  | 120
P001     | Mar  | 90
P001     | Apr  | 150
P002     | Gen  | 50
...

Come si fa:

  1. Seleziona le colonne da unpivotare (Gen, Feb, Mar, Apr).
  2. Tab Transform → Unpivot Columns → "Unpivot Selected Columns".
  3. Si crea una colonna "Attribute" (= nome colonna originale) e "Value".
  4. Rinomina "Attribute" in "Mese", "Value" in "Valore".
In M
Table.UnpivotOtherColumns(
    Tabella,
    {"Prodotto"},
    "Mese",
    "Valore"
)
Unpivot Other Columns — l'opzione robusta
Unpivot Other Columns dice: "tieni queste come chiavi, unpivota tutte le altre". Se domani arrivano nuovi mesi, vengono automaticamente unpivotati senza modificare la query. Best practice.
Pivot è l'operazione inversa
Se hai dati long e vuoi tornare wide per esportarli in Excel, esiste anche Pivot. Ma è raro servano in un modello Power BI: il modello dati ama long.
2

Group By — aggregare

Group By raggruppa righe per una o più colonne e calcola aggregati. Tab Transform → Group By, oppure Home → Group By.

Esempio: hai vendite per riga, vuoi totali per Prodotto:

Input
Prodotto | Data       | Quantita | Importo
P001     | 2025-01-15 | 2        | 200
P001     | 2025-01-20 | 1        | 100
P002     | 2025-01-18 | 5        | 250
Group By Prodotto → Sum Quantita, Sum Importo, Count Rows
Prodotto | TotQuantita | TotImporto | NumOrdini
P001     | 3           | 300        | 2
P002     | 5           | 250        | 1
In M
Table.Group(Tabella, {"Prodotto"}, {
    {"TotQuantita", each List.Sum([Quantita]), Int64.Type},
    {"TotImporto", each List.Sum([Importo]), type number},
    {"NumOrdini", each Table.RowCount(_), Int64.Type}
})

Aggregazioni disponibili:

  • Sum, Average, Min, Max, Median.
  • Count Rows, Count Distinct Rows, Count Values.
  • All Rows (mantiene le righe originali in una sotto-tabella — utile per Group By "tecnico").
Group By in Power Query vs misura DAX
Group By in PQ è utile per preparare tabelle aggregate riusabili (es. tabella "VenditeMensili" calcolata a refresh). Per aggregare al volo nei visual è meglio una misura DAX (più flessibile, reattiva al contesto del visual).
3

Colonna condizionale — IF semplice senza scrivere M

Dove: tab Add Column → Conditional Column. Si apre un wizard dove definisci le regole "Se [colonna] = X allora Y, altrimenti Z" senza scrivere codice.

Esempio. Vuoi una colonna "Fascia Cliente" basata sul fatturato:

Conditional Column generata automaticamente
Table.AddColumn(Tabella, "FasciaCliente",
    each if [FatturatoCliente] >= 100000 then "VIP"
         else if [FatturatoCliente] >= 10000 then "Top"
         else if [FatturatoCliente] >= 1000 then "Standard"
         else "Small",
    type text
)
Condizioni multiple — usa custom column per logiche complesse
Per logiche con AND/OR complessi (più di 2 colonne in input), il wizard wizard è limitante. Usa Add Column → Custom Column e scrivi direttamente l'espressione M:
M
if [Area] = "Nord" and [Importo] > 1000 then "Premium NORD"
else if [Area] = "Sud" and [Importo] > 800 then "Premium SUD"
else "Standard"
4

Custom Column — qualunque espressione M

Dove: tab Add Column → Custom Column. Apri un editor dove scrivi un'espressione M usando i nomi colonna come [NomeColonna].

Esempi di Custom Column
// Margine % calcolato
[Margine] / [Fatturato]

// Concatenazione
[Cliente] & " - " & [Codice]

// Estrai anno dalla data
Date.Year([DataDoc])

// Logica complessa
if Text.StartsWith([Codice], "EX") then "Export" else "Domestico"

// Lookup in lista
List.Contains({"IT","FR","DE"}, [Paese])
Custom Column non rompe il folding... a volte
Espressioni semplici (matematica, concatenazione) foldano verso SQL. Funzioni M custom complesse rompono il folding. Se la performance è critica e la sorgente è un DB, valuta di fare il calcolo direttamente in SQL nella vista sorgente.
5

Index column e altri trucchi utili

Tab Add Column ha alcune chicche:

  • Index Column — aggiunge una colonna 0..n o 1..n. Utile per fare join posizionali o ordinare in modo deterministico.
  • Column From Examples — Power Query "indovina" la trasformazione dai tuoi esempi. Tu scrivi 2-3 valori output desiderati, PQ genera l'espressione M. Magia per split/parsing rapidi.
  • Duplicate Column — duplica una colonna esistente per applicare trasformazioni diverse mantenendo l'originale.
6

Errori comuni

Unpivot di troppe colonne
Se selezioni le colonne sbagliate (es. anche "Prodotto" insieme ai mesi), unpivoti anche la chiave. Risultato: tabella illeggibile. Always: seleziona solo le colonne da unpivotare, oppure usa "Unpivot Other Columns" e indica le chiavi.
Group By che cambia il significato
Group By riduce il dettaglio. Se poi al modello ti accorgi che serviva il dettaglio (es. il codice ordine), hai dovuto fare Group By "All Rows" per non perderlo. Pianifica.
Conditional column che non gestisce null
Una conditional column del tipo if [Importo] > 100 then "Alto" non gestisce i null. Aggiungi sempre un caso esplicito: else if [Importo] = null then "N/D".
7

Esercitazioni

Esercizio 1Base

Unpivot delle vendite mensili

Consegna

Crea (o trova) un Excel con colonne: Prodotto, Gen, Feb, Mar, Apr (4 mesi di vendite). Caricalo in Power Query. Unpivot delle 4 colonne mese. Rinomina "Attribute" → "Mese", "Value" → "Vendite".

Esercizio 2Base

Group By per prodotto

Consegna

Sulla tabella long appena creata, fai Group By per Prodotto, calcolando: Sum(Vendite), Count Rows. Quale prodotto ha venduto di più?

Esercizio 3Base

Colonna condizionale 'Fascia'

Consegna

Aggiungi una colonna condizionale "Fascia" basata su Vendite: ≥ 200 → "Alta", 100-199 → "Media", 0-99 → "Bassa".

Esercizio 4Intermedia

Custom Column con logica composta

Consegna

Aggiungi una Custom Column "BonusEligibile" che restituisce true se: (Vendite > 150 AND Fascia = "Alta") OR Mese = "Dic". Scrivi l'espressione M.

Esercizio 5Intermedia

Column From Examples

Consegna

Hai una colonna "FullName" con valori tipo "Mario Rossi". Usa "Column From Examples" (Add Column → From Selection) per creare una colonna "Iniziali" che mostri "M. R.". Verifica l'espressione M generata.

Esercizio 6Avanzata

Group By + All Rows (trick)

Consegna

Vuoi calcolare per ogni Cliente la data dell'ultimo ordine, mantenendo tutte le altre colonne (data primo ordine, totale ordini, ecc.) evoler conservare comunque il dettaglio degli ordini in una sotto-tabella. Come fai con Group By "All Rows"?

Esercizio 7Avanzata

Unpivot dinamico

Consegna

Hai una tabella wide con colonne "Vendite_2024_Gen", "Vendite_2024_Feb", ..., "Vendite_2026_Dic" — 36 colonne. Vuoi unpivot e splittare il nome in "Anno" e "Mese". Pensa la pipeline in 4 step.

8

Quick check finale

Quick check

Quando preferisci 'Unpivot Other Columns' a 'Unpivot Selected Columns'?

Quick check

Per logica con AND/OR complessi, conviene:

Esercizio da consegnare · valutato dal docente

Trasforma un report 'wide' in formato analizzabile

intermedia⏱ 30-40 min

Crea in Excel un report "wide": una colonna Prodotto e poi una colonna per ogni mese (Gen, Feb, Mar, Apr) con dei valori di vendita. Almeno 5 prodotti. Poi in Power BI:

  1. Carica il file e apri Power Query.
  2. Seleziona la colonna Prodotto → Unpivot Other Columns per ottenere colonne Prodotto · Mese · Valore.
  3. Crea una query separata con Group By per Prodotto (somma del Valore).
  4. Aggiungi una colonna condizionale "Fascia" (es. Valore ≥ 1000 → "Alto", altrimenti "Basso").

Consegna il .pbix (oppure screenshot dei Applied Steps + tabella risultato long). Bonus: aggiungi un mese all'Excel e ricarica per dimostrare che la pipeline non si rompe.

Cosa valuterà il docente
  • I mesi sono stati portati in formato long con Unpivot Other Columns (non Unpivot Columns fisso)
  • La pipeline regge l'aggiunta di un mese (robustezza schema)
  • Group By produce una tabella aggregata corretta (es. totale per prodotto)
  • È presente una colonna condizionale/custom con logica sensata (es. fascia di valore)
  • Tipi colonna corretti (numeri come numeri, date come date)

Consegna esercizio (.pbix / .xlsx)

Accedi per caricare il tuo file e ricevere una valutazione dal docente.

Hai finito la Lezione 3.3 ✓

Nella 3.4 vediamo come combinare tabelle: Merge (il CERCA.VERT robusto) e Append (unione di tabelle stessa struttura).