SPLIT di due colonne con valori combinati correlati

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

Moderatore: Utilizzo_prof_Excel

Rispondi
Avatar utente

ggratis
Messaggi: 16 | Topic creati
Iscritto il: mar 14 lug 2020, 21:39
Luogo: Lecce-Pisa
Ringraziato: 5 volte

SPLIT di due colonne con valori combinati correlati

Messaggio da ggratis »

Saluti al gruppo,
vorrei semplificare il procedimento che ho seguito per "splittare" il contenuto di alcuni campi, avete qualche suggerimento?
Nel file allegato ho riportato la tabella di partenza ed il risultato atteso. Nel caso reale, la tabella di partenza è il risultato di una query autoreferenziale alla quale sono aggiunti tre campi note, due dei quali possono presentare per alcuni records dei valori corrispondenti come quelli rappresentati nei campi 4 e 5 della Tabella1 del file allegato, esempio:
A1|A2 ---> 5|10, oppure B1|B2|B3--->1|5|5 queste corrispondenze possono essere anche un numero indefinito superiore a 3, ma per ogni records tante sono nel campo 4 pari numero lo sono nel campo 5, e la corrispondenza è sempre primo con primo, secondo con secondo e così via.
:wave:
Allegati
GG1.xlsx
(143.82 KiB) Scaricato 13 volte


Avatar utente

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

SPLIT di due colonne con valori combinati correlati

Messaggio da Andrea90 »

Ciao ggratis,

Ti consiglio di evitare quel metodo di split di colonna, non genera delle query robuste:

Codice: Seleziona tutto

= Table.SplitColumn(#"Rimosse colonne", "CAMPO5", Splitter.SplitTextByDelimiter("|", QuoteStyle.Csv), {"CAMPO5.1", "CAMPO5.2", "CAMPO5.3"})
Questo genera un codice hardcoded che fissa il numero di campi che verranno generati dallo split. Prova ad aggiungere in riga 7 (ID4) un'altra B (B4) ed aggiorna la query, vedrai che ti rimangono comunque 3 campi.

Prova invece questa soluzione, dovrebbe essere abbastanza lineare, anche se magari si può pulire meglio il codice.

A presto,

Andrea
Allegati
GG1.xlsx
(149.9 KiB) Scaricato 14 volte
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
Avatar utente

Autore del topic
ggratis
Messaggi: 16 | Topic creati
Iscritto il: mar 14 lug 2020, 21:39
Luogo: Lecce-Pisa
Ringraziato: 5 volte

SPLIT di due colonne con valori combinati correlati

Messaggio da ggratis »

Andrea90 ha scritto: sab 13 feb 2021, 20:21 Ciao ggratis,
Ti consiglio di evitare quel metodo di split di colonna, non genera delle query robuste:
Si mi ero reso conto della cosa per questo avevo precisato che il numero di valori correlati poteva essere maggiore di 3 e imprecisato.
Grazie per la risposta, che andrò a leggere... :wave:
Avatar utente

Autore del topic
ggratis
Messaggi: 16 | Topic creati
Iscritto il: mar 14 lug 2020, 21:39
Luogo: Lecce-Pisa
Ringraziato: 5 volte

SPLIT di due colonne con valori combinati correlati

Messaggio da ggratis »

...ecco, mi hai dato di che studiare per domani!

Codice: Seleziona tutto

#"Suddividi colonna in base al delimitatore" = Table.ExpandListColumn(Table.TransformColumns(#"Aggiunta colonna indice", {{"CAMPO4", Splitter.SplitTextByDelimiter("|", QuoteStyle.Csv), let itemType = (type nullable text) meta [Serialized.Text = true] in type {itemType}}}), "CAMPO4"),
:crazy:
:wave:
Avatar utente

Autore del topic
ggratis
Messaggi: 16 | Topic creati
Iscritto il: mar 14 lug 2020, 21:39
Luogo: Lecce-Pisa
Ringraziato: 5 volte

SPLIT di due colonne con valori combinati correlati

Messaggio da ggratis »

Provando a fare tutto con un'unica query, scopiazzando un po' dalla rete, ho tirato fuori questi passaggi, ma c'è qualcosa che non va nel passaggio "Pivoted Column"... :cry:

Codice: Seleziona tutto

let
Source = Excel.CurrentWorkbook(){[Name="Tabella1"]}[Content],
    #"Filtrate righe" = Table.SelectRows(Source, each Text.Contains([CAMPO4], "|")),
#"Removed Columns" = Table.RemoveColumns(#"Filtrate righe",{"CAMPO4"}),
#"Split Column by Delimiter" = Table.ExpandListColumn(Table.TransformColumns(#"Removed Columns", {{"CAMPO5", Splitter.SplitTextByDelimiter("|", QuoteStyle.None), let itemType = (type nullable text) meta [Serialized.Text = true] in type {itemType}}}), "CAMPO5"),
CAMPO5 = Table.AddIndexColumn(#"Split Column by Delimiter", "Index", 1, 1),
#"Removed Columns1" = Table.RemoveColumns(#"Filtrate righe",{"CAMPO5"}),
#"Split Column by Delimiter2" = Table.ExpandListColumn(Table.TransformColumns(#"Removed Columns1", {{"CAMPO4", Splitter.SplitTextByDelimiter("|", QuoteStyle.None), let itemType = (type nullable text) meta [Serialized.Text = true] in type {itemType}}}), "CAMPO4"),
CAMPO4 = Table.AddIndexColumn(#"Split Column by Delimiter2", "Index", 1, 1),
#"Consolidated" = CAMPO5 & CAMPO4,
#"Unpivoted Other Columns" = Table.UnpivotOtherColumns(Consolidated, {"Index"}, "Attribute", "Value"),
    #"Pivoted Column" = Table.Pivot(Table.TransformColumnTypes(#"Unpivoted Other Columns", {{"Index", type text}}), List.Distinct(Table.TransformColumnTypes(#"Unpivoted Other Columns", {{"Index", type text}})[Index]), "Index", "Value"),
#"Transposed Table" = Table.Transpose(#"Pivoted Column"),
#"Promoted Headers" = Table.PromoteHeaders(#"Transposed Table", [PromoteAllScalars=true])
in
    #"Promoted Headers"
...provando a fare la stessa cosa seguendo il tuo (Andrea90 ) procedimento ci sono riuscito! :clap:

Codice: Seleziona tutto

let
    Origine = Excel.CurrentWorkbook(){[Name="Tabella1"]}[Content],
    Tab0 = Table.TransformColumnTypes(Origine,{{"CAMPO1", type text}, {"CAMPO2", type number}, {"CAMPO3", type number}, {"CAMPO4", type text}, {"CAMPO5", type any}}),
    Indice0 = Table.TransformColumnTypes( Table.AddIndexColumn(Tab0, "Indice", 1, 1),{{"Indice", Int64.Type}}),
    SplitCampo4 = Table.ExpandListColumn(Table.TransformColumns(Indice0, {{"CAMPO4", Splitter.SplitTextByDelimiter("|", QuoteStyle.Csv), let itemType = (type nullable text) meta [Serialized.Text = true] in type {itemType}}}), "CAMPO4"),
    TipoCampo4 = Table.TransformColumnTypes(SplitCampo4,{{"CAMPO4", type text}}),
    Indice1 = Table.TransformColumnTypes( Table.AddIndexColumn(TipoCampo4, "Indice.1", 1, 1),{{"Indice.1", Int64.Type}}),
    TabCampo4 = Table.RemoveColumns(Indice1,{"CAMPO5"}),

    SplitCampo5 = Table.ExpandListColumn(Table.TransformColumns(Table.TransformColumnTypes(Indice0, {{"CAMPO5", type text}}, "it-IT"), {{"CAMPO5", Splitter.SplitTextByDelimiter("|", QuoteStyle.Csv), let itemType = (type nullable text) meta [Serialized.Text = true] in type {itemType}}}), "CAMPO5"),
    TipoCampo5 = Table.TransformColumnTypes(SplitCampo5,{{"CAMPO5", Int64.Type}}),
    TabCampo5 = Table.TransformColumnTypes(Table.AddIndexColumn(TipoCampo5, "Indice.1", 1, 1),{{"Indice.1", Int64.Type}}),

    MergeTabCampo4TabCampo5 = Table.NestedJoin(TabCampo4,{"Indice", "Indice.1"},TabCampo5,{"Indice", "Indice.1"},"TabCampo5",JoinKind.LeftOuter),
    TabCampo4TabCampo5ConIndici = Table.ExpandTableColumn(MergeTabCampo4TabCampo5, "TabCampo5", {"CAMPO5"}, {"CAMPO5"}),
    Risultato = Table.RemoveColumns(TabCampo4TabCampo5ConIndici,{"Indice", "Indice.1"})
in
    Risultato
con un paio di esercizi, non si può certo imparare il codice M, ma ora che me lo avete fatto conoscere, vi toccherà sopportarmi ;)
:wave:
Rispondi