Lezione 3.4
Merge · Append
Modulo 03 · Lezione 3.4 · Livello Base

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
1

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 — append di tre tabelle
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.
Append vs Combine Files
Se i file sono in una stessa cartella, preferisci "Folder → Combine Files" (lo vedemmo in L2.3): è più automatico e gestisce schema invariante meglio. Append è per query già esistenti in PQ.
Colonne con nomi diversi non si fondono
Append unisce per nome di colonna. Se nelle 3 query hai "Importo" in una e "Imp" in un'altra, ti ritrovi 2 colonne separate piene di null per metà delle righe. Uniforma i nomi prima dell'Append.
2

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.

  1. Scegli la tabella destra.
  2. Click sulla colonna chiave nella sinistra, click sulla colonna chiave nella destra (devono matchare per valore).
  3. Scegli il Join Kind (vedi sotto).
  4. Risultato: una nuova colonna che contiene la tabella destra "espandibile".
  5. Click sull'icona di espansione (⇆) e scegli quali colonne della destra includere.
Table.NestedJoin — Merge in M
Table.NestedJoin(
    Vendite,
    {"IdProdotto"},
    Prodotti,
    {"Id"},
    "Prodotto",
    JoinKind.LeftOuter
)
3

I 6 tipi di Join

AspettoTipo di JoinCosa restituisce
Left Outer (default)Left Outer (default)Tutte le righe di sinistra + match dalla destra (null se manca)
Right OuterRight OuterTutte le righe di destra + match dalla sinistra (null se manca)
Full OuterFull OuterTutte le righe di entrambe (null per i lati senza match)
InnerInnerSolo righe con match in entrambe
Left AntiLeft AntiRighe della sinistra SENZA match nella destra
Right AntiRight AntiRighe della destra SENZA match nella sinistra
Quando usare quale (esempi reali)
  • 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.
4

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:

M
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):

M
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?

M
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?

M
FullCompare = Table.NestedJoin(
    SistemaA, {"CodFiscale"},
    SistemaB, {"CodFiscale"},
    "b",
    JoinKind.FullOuter
)
// Poi filtri dove [CodFiscale] = null (solo in B) o [b] = null (solo in A).
5

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.
Quando 'as New'
Usa "as New" quando il risultato del merge serve come tabella derivata riusabile, separata dalle sorgenti. Esempio: "VenditeArricchite" come tabella fatta apposta per il modello, mentre "Vendite" e "Prodotti" restano pulite per altri usi.
6

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.

Merge su due colonne (Anno, Mese)
Table.NestedJoin(
    Vendite, {"Anno", "Mese"},
    Target, {"Anno", "Mese"},
    "t",
    JoinKind.LeftOuter
)
7

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 vs Relazione DAX — quando scegliere quale
  • 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.
Il Modulo 4 è dedicato alla modellazione e relazioni DAX.
8

Esercitazioni

Esercizio 1Base

Append di tre tabelle mensili

Consegna

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.

Esercizio 2Base

Append as New vs Append diretto

Consegna

Per il caso sopra, è meglio "Append Queries" (modifica la query corrente) o "Append Queries as New" (crea nuova query)? Argomenta.

Esercizio 3Base

Merge Vendite + Prodotti (Left Outer)

Consegna

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?

Esercizio 4Intermedia

Trova clienti senza ordini (Right Anti)

Consegna

Anagrafica Clienti (1000 righe) + Tabella Ordini (5000 righe). Quali clienti non hanno mai fatto un ordine? Quale tipo di Merge usi e perché?

Esercizio 5Intermedia

Merge su 2 chiavi composte

Consegna

Vendite per Anno/Mese + Target per Anno/Mese. Vuoi una tabella con Vendite e Target affiancati. Spiega come imposti il Merge.

Esercizio 6Avanzata

Confronto liste (Full Outer)

Consegna

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.

Esercizio 7Avanzata

Merge vs Relazione — decisione

Consegna

In quale dei due casi useresti Merge PQ e in quale una Relazione DAX nel modello? Spiega:

  1. Vuoi una colonna calcolata "Categoria_Prodotto" nella tabella Vendite per fare poi filtri di pagina.
  2. Vuoi che misure DAX "Fatturato per Categoria" si aggreghino correttamente nei visual.
9

Quick check finale

Quick check

Equivalente del CERCA.VERT in Power Query è:

Quick check

Vuoi trovare ordini con IdProdotto orfano (non in anagrafica). Quale Merge usi?

Esercizio da consegnare · valutato dal docente

Arricchisci le vendite e trova i prodotti orfani

intermedia⏱ 30-40 min

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.

  1. Merge Vendite + Prodotti (Left Outer) per aggiungere NomeProdotto e Categoria alle vendite.
  2. Crea una seconda query con Left Anti per elencare le vendite "orfane" (prodotto inesistente).
  3. 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é.

Cosa valuterà il docente
  • 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.