Errore merge right anti L’argomento è risolto

Non è propriamente un programma di BI, ma nelle sue versioni più recenti anche Excel può fare grandi cose!

Moderatore: Utilizzo_prof_Excel

Rispondi

H725
Messaggi: 23 | Topic creati
Iscritto il: gio 4 mag 2023, 21:14

Errore merge right anti

Messaggio da H725 »

Un saluto tutto il forum.
Giornalmente mi arriva un catalogo da un fornitore con i vari prodotti in formato .csv. Io ho il catalogo del giorno precedente e il catalogo del giorno attuale. Vorrei confrontarli per trovare le differenze e applico un Merge di tipo Right Anti che dovrebbe restituirmi tutti i prodotti del catalogo nuovo che non sono stati trovati nel vecchio catalogo, ma la funzione restituisce risultati errati.
Allego codice M.
Grazie a chiunque riesca ad aiutarmi.

Codice: Seleziona tutto

let
    Origine = Excel.CurrentWorkbook(){[Name="tblDisponibilita"]}[Content], //catalogo dei soli prodotti interessati SKU - CODICE
    MergeDisponibilita = Table.NestedJoin(Origine, {"CODICE"}, Articoli_old, {"CODICE"}, "Articoli_old", JoinKind.LeftOuter), // merge con catalogo fornitore giorno precedente
    RimosseColonne = Table.SelectColumns(MergeDisponibilita,{"Articoli_old"}), //rimuovo colonne non interessate
    TabellaArticoli_oldEspansa = Table.ExpandTableColumn(RimosseColonne, "Articoli_old", {"LINEA", "MARCA", "CODICE", "RAGGRUPPAMENTO", "DESCRIZIONE", "DESCRIZIONE_ENG", "VA1_ITA", "VA1_ENG", "RIF_ORIG", "RIF_FORN", "LISTINO_IVA_INCL", "LISTINO_IVA_ESCL", "PZ_CONF", "SCONTO", "DISPONIBILE", "ST", "BARCODE", "IMMAGINE", "IMMAGINE2", "PESO", "TEC", "MKT", "ID"}, {"LINEA", "MARCA", "CODICE", "RAGGRUPPAMENTO", "DESCRIZIONE", "DESCRIZIONE_ENG", "VA1_ITA", "VA1_ENG", "RIF_ORIG", "RIF_FORN", "LISTINO_IVA_INCL", "LISTINO_IVA_ESCL", "PZ_CONF", "SCONTO", "DISPONIBILE", "ST", "BARCODE", "IMMAGINE", "IMMAGINE2", "PESO", "TEC", "MKT", "ID"}), /// espansione tabella
    FiltraRighe = Table.SelectRows(TabellaArticoli_oldEspansa, each ([CODICE] <> null)),//filtro valori nulli

    // questo è il passaggio che restituisce valori sbagliati
    Join_Articoli_new = Table.NestedJoin(FiltraRighe, {"CODICE", "DISPONIBILE"}, Articoli_new, {"CODICE", "DISPONIBILE"}, "Articoli_new", JoinKind.RightAnti),//merge con catalogo formitore giorno nuovo tramite 2 campi CODICE - DISPONIBILE
    RimosseAltreColonne = Table.SelectColumns(Join_Articoli_new,{"Articoli_new"}),//rimuovo colonne
    TabellaArticoli_newEspansa = Table.ExpandTableColumn(RimosseAltreColonne, "Articoli_new", {"CODICE", "DESCRIZIONE", "DISPONIBILE"}, {"CODICE", "DESCRIZIONE", "DISPONIBILE"})//espansione tabella
in
    TabellaArticoli_newEspansa
Allegati
Confronto listini.xlsx
(250.31 KiB) Scaricato 7 volte


Avatar utente

Andrea90
Messaggi: 2255 | Topic creati
Iscritto il: dom 28 giu 2020, 19:41
Luogo: Bologna
Ringraziato: 672 volte
Contatta:

Errore merge right anti

Messaggio da Andrea90 »

@H725,

Fai un esempio di dato che non ti torna, perché non è che possiamo metterci noi a studiarci il tuo caso dall'inizio.

Andrea
Se hai gradito l'aiuto che hai ricevuto considera di contribuire alle spese per il mantenimento del forum facendo una libera DONAZIONE --> Link

Ricordarsi di segnare come "RISOLTE" le discussioni per le quali si è ricevuto un feedback positivo. Per vedere come fare --> Link

Autore del topic
H725
Messaggi: 23 | Topic creati
Iscritto il: gio 4 mag 2023, 21:14

Errore merge right anti

Messaggio da H725 »

Grazie per la risposta,
i cataloghi sono volutamente uguali, ma la query restituisce un risultato di 61 record "diversi", oppure puoi modificare un valore del campo "DISPONIBILE" in uno dei 2 cataloghi e vedrai che il risultato cambia ma in maniera strana.
Avatar utente

Andrea90
Messaggi: 2255 | Topic creati
Iscritto il: dom 28 giu 2020, 19:41
Luogo: Bologna
Ringraziato: 672 volte
Contatta:

Errore merge right anti

Messaggio da Andrea90 »

Tu fai un merge che prende in considerazione la combinazione di due campi: CODICE e DISPONIBILITA'

Nella tabella new c'è ad esempio il codice MLE0006 con disponibilità 0
Nella tabella old c'è il codice MLE0006 con disponibilità <20

Quindi questo record comparirà nella query risultante finale poiché la prima combinazione non esiste nella tabella old. Torno a ripetere la domanda (e non devo mettermi io a cambiare le query per provare devi essere tu a spiegarti), che risultato ti aspetteresti in questo caso?

Andrea
Se hai gradito l'aiuto che hai ricevuto considera di contribuire alle spese per il mantenimento del forum facendo una libera DONAZIONE --> Link

Ricordarsi di segnare come "RISOLTE" le discussioni per le quali si è ricevuto un feedback positivo. Per vedere come fare --> Link

Autore del topic
H725
Messaggi: 23 | Topic creati
Iscritto il: gio 4 mag 2023, 21:14

Errore merge right anti

Messaggio da H725 »

Grazie per la pazienza Andrea.
Il risultato che mi aspetto è un solo record (MLE0006 che ho volutamente cambiato io nei 2 cataloghi la DISPONIBILITA'), ma la query mi restituisce 62 righe. A te quante ne restituisce?
Avatar utente

Andrea90
Messaggi: 2255 | Topic creati
Iscritto il: dom 28 giu 2020, 19:41
Luogo: Bologna
Ringraziato: 672 volte
Contatta:

Errore merge right anti

Messaggio da Andrea90 »

Ma tu mica metti in join la tabella new con la tabella old.

La tabella old non viene presa tutta, perché tu parti dalla tabella tblDisponibilità che leghi con un inner join alla tabella old. E prendi solo quei record per i quali trovi corrispondenza.

Quindi se prendi la tabella old ad esempio trovi il codice MLE0028 con disponibilità 20+ e questa combinazione è presente anche nella tabella new. Ma tu prima rimuovi questa combinazione per il merge che fai iniziale tra la tabella old e quella delle disponibilità.

Ecco perché poi ti ricompare tra le 62 righe finali, perché c'è in tabella new, ma non più in tabella old.

Andrea
Se hai gradito l'aiuto che hai ricevuto considera di contribuire alle spese per il mantenimento del forum facendo una libera DONAZIONE --> Link

Ricordarsi di segnare come "RISOLTE" le discussioni per le quali si è ricevuto un feedback positivo. Per vedere come fare --> Link

Autore del topic
H725
Messaggi: 23 | Topic creati
Iscritto il: gio 4 mag 2023, 21:14

Errore merge right anti

Messaggio da H725 »

Io, di tutto il catalogo, voglio verificare solo i codici tblDisponibilità (il fornitore ha molti oggetti che io non uso).
Come posso verificare nei 2 cataloghi solo gli oggetti presenti nella tabella tblDisponibilità?
Avatar utente

Andrea90
Messaggi: 2255 | Topic creati
Iscritto il: dom 28 giu 2020, 19:41
Luogo: Bologna
Ringraziato: 672 volte
Contatta:

Errore merge right anti

Messaggio da Andrea90 »

E allora dovrai fare quel inner join con la tblDisponibilità non solo per la tabella old, ma anche per la tabella new così eliminerai da entrambe i codici che non ti interessano prima di fare il merge finale.
Se hai gradito l'aiuto che hai ricevuto considera di contribuire alle spese per il mantenimento del forum facendo una libera DONAZIONE --> Link

Ricordarsi di segnare come "RISOLTE" le discussioni per le quali si è ricevuto un feedback positivo. Per vedere come fare --> Link

Autore del topic
H725
Messaggi: 23 | Topic creati
Iscritto il: gio 4 mag 2023, 21:14

Errore merge right anti

Messaggio da H725 »

OK, chiarissimo.
Grazie della pazienza
Avatar utente

Andrea90
Messaggi: 2255 | Topic creati
Iscritto il: dom 28 giu 2020, 19:41
Luogo: Bologna
Ringraziato: 672 volte
Contatta:

Errore merge right anti

Messaggio da Andrea90 »

@H725,

Un appunto, non ricordo bene, ma tu utilizzi un left outer join per legare la tabella delle disponibilità con quella old?
Perché poi se vuoi tenere solo quelle righe allora dovrai eliminare quelle che ti riportano un valore null... Perché fare questi doppi passaggi? Fai una inner join e già con quella avrai solo le righe che esistono in entrambe le tabelle.

Andrea
Se hai gradito l'aiuto che hai ricevuto considera di contribuire alle spese per il mantenimento del forum facendo una libera DONAZIONE --> Link

Ricordarsi di segnare come "RISOLTE" le discussioni per le quali si è ricevuto un feedback positivo. Per vedere come fare --> Link
Rispondi