Merge e Append: il CERCA.VERT robusto + unione di tabelle
Due verbi che farai ogni giorno. Merge è il VLOOKUP/CERCA.VERT del mondo Power BI ma più potente. Append è quando hai più tabelle con la stessa struttura e le vuoi una sola. Vediamo tutti i tipi di join e i pattern reali.
- ⏱ Tempo stimato: ~30 min + esercizi
- 🎯 Prerequisiti: L3.1, L3.2, L3.3
- 🛠 Software: Power BI Desktop
Append — impilare tabelle con la stessa struttura
Append prende due o più tabelle con le stesse colonne e le mette una sotto l'altra. Equivalente di "Copy & Paste" tra fogli Excel — ma riproducibile.
Dove: Home → Append Queries → Append Queries / Append Queries as New.
Table.Combine({Vendite_Gen, Vendite_Feb, Vendite_Mar})Casi d'uso tipici:
- 12 file mensili stessa struttura → 12 query → Append.
- Vendite del 2024 + Vendite del 2025 in due tabelle separate (storico).
- Tre sistemi gestionali con la stessa anagrafica clienti.
Merge — il CERCA.VERT robusto
Merge equivale al CERCA.VERT di Excel: prende una tabella sinistra, una destra, e per ogni riga della sinistra cerca corrispondenze nella destra basandosi su una chiave.
Dove: Home → Merge Queries → Merge Queries / Merge Queries as New.
- Scegli la tabella destra.
- Click sulla colonna chiave nella sinistra, click sulla colonna chiave nella destra (devono matchare per valore).
- Scegli il Join Kind (vedi sotto).
- Risultato: una nuova colonna che contiene la tabella destra "espandibile".
- Click sull'icona di espansione (⇆) e scegli quali colonne della destra includere.
Table.NestedJoin(
Vendite,
{"IdProdotto"},
Prodotti,
{"Id"},
"Prodotto",
JoinKind.LeftOuter
)I 6 tipi di Join
| Aspetto | Tipo di Join | Cosa restituisce |
|---|---|---|
| Left Outer (default) | Left Outer (default) | Tutte le righe di sinistra + match dalla destra (null se manca) |
| Right Outer | Right Outer | Tutte le righe di destra + match dalla sinistra (null se manca) |
| Full Outer | Full Outer | Tutte le righe di entrambe (null per i lati senza match) |
| Inner | Inner | Solo righe con match in entrambe |
| Left Anti | Left Anti | Righe della sinistra SENZA match nella destra |
| Right Anti | Right Anti | Righe della destra SENZA match nella sinistra |
- Left Outer: arricchire le vendite con info prodotto. Default per il 90% dei casi.
- Inner: trovare clienti che hanno anche un'opportunity attiva.
- Left Anti: trovare ordini senza riferimento a un prodotto in anagrafica (errori).
- Right Anti: prodotti mai venduti (dimensione - fatti).
- Full Outer: confrontare due liste clienti per trovare differenze.
Pattern reali di Merge
Pattern 1: arricchire fatti con dimensioni
Tabella Vendite (milioni di righe) + tabella Prodotti (migliaia). Merge Left Outer per aggiungere nome prodotto, categoria, marchio:
MergeProdotti = Table.NestedJoin(
Vendite, {"IdProdotto"},
Prodotti, {"Id"},
"p",
JoinKind.LeftOuter
),
EspandiProdotto = Table.ExpandTableColumn(
MergeProdotti, "p",
{"NomeProdotto", "Categoria", "Marchio"}
)Pattern 2: trova orfani (Left Anti)
Vuoi sapere quali ordini hanno un IdProdotto inesistente in anagrafica (data quality):
OrdiniOrfani = Table.NestedJoin(
Ordini, {"IdProdotto"},
Prodotti, {"Id"},
"p",
JoinKind.LeftAnti
)
// risultato: righe di Ordini senza corrispondenza in Prodotti.Pattern 3: dimensione (clienti) non mai usata (Right Anti)
Quali clienti dell'anagrafica non hanno mai fatto un ordine?
ClientiDormienti = Table.NestedJoin(
Ordini, {"IdCliente"},
Clienti, {"Id"},
"c",
JoinKind.RightAnti
)Pattern 4: confronto liste (Full Outer)
Hai 2 export di anagrafica di 2 sistemi diversi. Quali clienti hanno solo in uno o solo nell'altro?
FullCompare = Table.NestedJoin(
SistemaA, {"CodFiscale"},
SistemaB, {"CodFiscale"},
"b",
JoinKind.FullOuter
)
// Poi filtri dove [CodFiscale] = null (solo in B) o [b] = null (solo in A).Merge come Nuova Query vs Merge Inline
Power Query offre:
- Merge Queries: aggiunge uno step alla query corrente.
- Merge Queries as New: crea una nuova query separata col risultato del merge. Le tabelle originali restano intoccate.
Merge su più colonne chiave
Quando una chiave non basta (es. (Anno, Mese)), tieni premuto Ctrl per selezionare più colonne in sinistra e in destra. L'ordine conta: la prima colonna a sinistra match con la prima a destra, e così via.
Table.NestedJoin(
Vendite, {"Anno", "Mese"},
Target, {"Anno", "Mese"},
"t",
JoinKind.LeftOuter
)Performance e Merge — attenzione
Merge è potente ma costoso se le tabelle sono grandi. Linee guida:
- Filtra prima le tabelle: tieni solo le righe e colonne che servono.
- Indici / Chiavi indicizzate sul DB sorgente migliorano il folding.
- Evita Merge in modalità DirectQuery se possibile — può rompere il folding.
- Per dimensioni piccole, il modello DAX con relazioni è meglio del merge in PQ.
- Merge in PQ: serve "denormalizzare" prima del modello, oppure usare colonne dalla destra in formule M.
- Relazione DAX: preferibile quasi sempre. Mantiene lo schema a stella, performance ottimali.
Esercitazioni
Append di tre tabelle mensili
Hai tre query: "Vendite_Gen", "Vendite_Feb", "Vendite_Mar", stessa struttura. Fai Append per ottenere "Vendite_Q1". Verifica che il count totale = somma dei singoli.
Append as New vs Append diretto
Per il caso sopra, è meglio "Append Queries" (modifica la query corrente) o "Append Queries as New" (crea nuova query)? Argomenta.
Merge Vendite + Prodotti (Left Outer)
Hai una tabella "Vendite" con [IdProdotto] e una tabella "Prodotti" con [Id, Nome, Categoria]. Fai Merge per arricchire Vendite con Nome e Categoria. Cosa noti se qualche IdProdotto delle vendite non esiste in Prodotti?
Trova clienti senza ordini (Right Anti)
Anagrafica Clienti (1000 righe) + Tabella Ordini (5000 righe). Quali clienti non hanno mai fatto un ordine? Quale tipo di Merge usi e perché?
Merge su 2 chiavi composte
Vendite per Anno/Mese + Target per Anno/Mese. Vuoi una tabella con Vendite e Target affiancati. Spiega come imposti il Merge.
Confronto liste (Full Outer)
Hai due liste di SKU prodotti, una dal sistema A (12.000 SKU) e una dal sistema B (10.500 SKU). Vuoi sapere: (1) SKU solo in A, (2) SKU solo in B, (3) SKU in entrambi. Scrivi la pipeline PQ.
Merge vs Relazione — decisione
In quale dei due casi useresti Merge PQ e in quale una Relazione DAX nel modello? Spiega:
- Vuoi una colonna calcolata "Categoria_Prodotto" nella tabella Vendite per fare poi filtri di pagina.
- Vuoi che misure DAX "Fatturato per Categoria" si aggreghino correttamente nei visual.
Quick check finale
Equivalente del CERCA.VERT in Power Query è:
Vuoi trovare ordini con IdProdotto orfano (non in anagrafica). Quale Merge usi?
Arricchisci le vendite e trova i prodotti orfani
Prepara due file Excel: Vendite (colonne IdProdotto,Importo) e Prodotti (colonne IdProdotto,NomeProdotto, Categoria). Inserisci di proposito 1-2 vendite con un IdProdotto che NON esiste in Prodotti.
- Merge Vendite + Prodotti (Left Outer) per aggiungere NomeProdotto e Categoria alle vendite.
- Crea una seconda query con Left Anti per elencare le vendite "orfane" (prodotto inesistente).
- Se hai più file vendite di mesi diversi, fai un Append per unirli.
Consegna il .pbix con le query visibili (o screenshot delle due tabelle: arricchita + orfani). Indica nel commento quale JoinKind hai usato e perché.
- Il Merge usa il JoinKind corretto (Left Outer per arricchire, mantenendo tutte le vendite)
- La colonna espansa porta solo i campi utili (non tutta la tabella annidata)
- La query "orfani" usa Left Anti per isolare le vendite senza prodotto corrispondente
- Append usato correttamente per impilare tabelle con la stessa struttura
- Nessun errore o colonna duplicata nella tabella finale
Consegna esercizio (.pbix / .xlsx)
Accedi per caricare il tuo file e ricevere una valutazione dal docente.
Hai finito la Lezione 3.4 ✓
Ultimo step del Modulo 3: scendiamo nel linguaggio M e impariamo a leggere e ritoccare l'editor avanzato.