Colonna condizionale con doppia condizione 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

simonas
Messaggi: 16 | Topic creati
Iscritto il: gio 25 feb 2021, 11:31
Ringraziato: 1 volta

Colonna condizionale con doppia condizione

Messaggio da simonas »

Ciao a tutte e tutti!
Ho un problema che mi sembra abbastanza banale, ma che dopo un po' di tentativi ancora non riesco a capire come risolvere.
Come faccio a creare una nuova colonna condizionale in Power Query con una doppia condizione (if x=1 and y=2 then ...)?

Passando al mio caso specifico io devo calcolare un fattore che può essere 0, 0,5 o 1 in base ai valori di due colonne, ovvero il sito e il mese.
Il valore del fattore è 1 da dicembre a marzo a prescindere dal sito, è 0 da maggio a settembre a prescindere dal sito mentre per ottobre, novembre e aprile cambia in base al sito. I siti possono essere classificati in 3 categorie (C,E,D) e in base alla categoria il fattore avrà un valore diverso in quei tre mesi. Per applicare questa doppia condizione ho provato a creare una funzione, ma non capisco bene cosa sto sbagliando e cosa devo cambiare per farla funzionare (sicuramente per la mia scarsa conoscenza del linguaggio M).
Allego il file.

Grazie in anticipo!

P.S. preciso che ho letto altri thread nel forum con lo stesso argomento, ma poiché ho molti casi possibili volevo provare ad aggregarli.
Il file è allegato nella risposta sottostante
Ultima modifica di simonas il gio 20 mag 2021, 16:19, modificato 3 volte in totale.


Avatar utente

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

Colonna condizionale con doppia condizione

Messaggio da Andrea90 »

Ciao simonas,

Non ho accesso al tuo file poiché mancano alcuni dati di origine e quindi non mi permette di vedere la formula da te utilizzata (la puoi copiare ed incollare qui così da poterci dare un’occhiata).
Comunque in M le formule con doppie condizioni funzionano come in molti altri linguaggi, pertanto dovrai far ricorso ad operatori logici come and o or per riuscire a costruire il flusso corretto.

A presto,
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
simonas
Messaggi: 16 | Topic creati
Iscritto il: gio 25 feb 2021, 11:31
Ringraziato: 1 volta

Colonna condizionale con doppia condizione

Messaggio da simonas »

Scusami, non avevo pensato a sistemare anche quelle altre tabelle!
Comunque sì, la domanda l'ho posta un po' larga, in effetti ho visto che gli operatori and, or funzionano normalmente, ma avendo molti casi diversi diventa un po' pesante scriverne uno alla volta, per questo volevo provare a fare una cosa più "condensata".
Riallego il file corretto.
Allegati
esempio_colonna.xlsb
(57.6 KiB) Scaricato 66 volte
Avatar utente

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

Colonna condizionale con doppia condizione

Messaggio da Andrea90 »

Ciao simonas,

aprendo il file ho visto una serie di se legati al solo valore del mese. Piuttosto che scrivere una formula (tralasciamo anche i modelli dati per il momento), non conviene crearti una tabella di appoggio che contenga le varie combinazioni che ti servono da legare poi, tramite merge, alla tua query Dati_Meteo_GG ?
In questo modo sarà molto più semplice gestire i diversi valori, e non dovrai scrivere nessuna formula.

A presto,
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
simonas
Messaggi: 16 | Topic creati
Iscritto il: gio 25 feb 2021, 11:31
Ringraziato: 1 volta

Colonna condizionale con doppia condizione

Messaggio da simonas »

Intanto grazie per le risposte!
Intendi una tabella da scrivere manualmente su excel del tipo
Gennaio | E | 1
Gennaio | D | 1
Gennaio | C | 1
ecc...?
Sì forse questa è la cosa più semplice anche se avrei preferito fare tutte queste operazioni in power query visto che il mio file excel è già bello pieno e volevo evitare di scrivere cose che non servono successivamente (questa tabella che sto elaborando è la base per tutta una serie di calcoli successivi).
Avatar utente

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

Colonna condizionale con doppia condizione

Messaggio da Andrea90 »

Ciao simonas,

Sinceramente, tra lo scrivermi una 20ina di se tutti uguali in una formula (che mai mi ricorderei in futuro come erano stati impostati) o crearmi un file csv da mettere in una cartella, con le diverse combinazioni che mi servono, importarlo e legarlo con un merge tramite interfaccia utente (operazione molto semplice da realizzare), io preferisco di gran lunga la seconda.

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
simonas
Messaggi: 16 | Topic creati
Iscritto il: gio 25 feb 2021, 11:31
Ringraziato: 1 volta

Colonna condizionale con doppia condizione

Messaggio da simonas »

Sì, in effetti sono d'accordo con te, il mio problema è solo che il file deve essere salvato su una cartella condivisa e usato anche da altre persone, quindi più cose metto all'esterno (di power query o del file in un'altra cartella) e più ci sono probabilità che muovendo qualcosa il file non funzioni più.
A prescindere da ciò che sceglierò, la funzione così come l'ho scritta non me la fa richiamare quando vado a creare una nuova colonna con la modalità "richiama funzione personalizzata" o se uso "colonna personalizzata" mi dà errore.
In particolare non capisco se io voglio che mi restituisca il valore che ho calcolato in fattore2 cosa devo scrivere dopo il let inizial e l'in finale?

Codice: Seleziona tutto

let fattore = (sito as text, mese as text) as table =>
    
    let zona = (sito as text) as text => 
                if sito = ("Bolzano" or "Brescia" or "Carmagnola" or "Stura" or "Torino" or "Suzzara" or "Verrone/Biella") then  "E" else 
                        if sito = "Foggia" or "Melfi" or "Atessa" then  "D" else
                        if sito = "Cassino" or "Pomigliano" or "Termoli" then  "C" else 
                        null
    in zona,
    
    
    fattore2 = Table.AddColumn (fattore, "FattoreGG", 
    each if mese = "Gennaio" then 1 
    else if mese = "Febbraio" then 1 
    else if mese = "Marzo" then 1
    else if mese = "Aprile" and (zona = "E" or zona = "D") then 0.5
    else if mese = "Aprile" and zona = "C" then 0
    else if mese = "Maggio" then 0
    else if mese = "Giugno" then 0
    else if mese = "Luglio" then 0
    else if mese = "Agosto" then 0
    else if mese = "Settembre" then 0
    else if mese = "Ottobre" and zona = "E" then 0.5
    else if mese = "Ottobre" and (zona = "C" or zona = "D") then 0
    else if mese = "Novembre" and (zona = "E" or zona = "D") then 1
    else if mese = "Novembre" and zona = "C" then 0.5
    else if mese = "Dicembre" then 1
    else null, type number)
    
in
    fattore
Avatar utente

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

Colonna condizionale con doppia condizione

Messaggio da Andrea90 »

Ciao simonas,

Alla luce di questa tua affermazione:
simonas ha scritto: gio 20 mag 2021, 15:42 la mia scarsa conoscenza del linguaggio M
e ad una delle best practices di molti linguaggi di programmazione (KIS = Keep it Simple), lascerei perdere la strada che stai seguendo). Ti spiego alcune cose che non vanno:
simonas ha scritto: gio 20 mag 2021, 16:58 deve essere salvato su una cartella condivisa e usato anche da altre persone, quindi più cose metto all'esterno (di power query o del file in un'altra cartella) e più ci sono probabilità che muovendo qualcosa il file non funzioni più.
Allora salva questa tabella in un foglio excel nascosto, non saranno certo quella 20 righe a rallentare la tua procedura o a renderla complicata.

Codice: Seleziona tutto

 if sito = ("Bolzano" or "Brescia" or "Carmagnola" or "Stura" or "Torino" or "Suzzara" or "Verrone/Biella")
Questa non è una sintassi che funziona, proverei una simile:

Codice: Seleziona tutto

(sito as text) as text =>
    if List.Contains({"Bolzano", "Brescia", "Carmagnola", "Stura", "Torino", "Suzzara", "Verrone/Biella"}, sito) then "E" else 
    if List.Contains({"Foggia", "Melfi", "Atessa"}, sito) then  "D" else
    if List.Contains({"Cassino", "Pomigliano", "Termoli"}, sito) then  "C" else 
    ""
Altro appunto, se richiedi di ricevere del text come tipo di dato risultante non puoi indicare come possibile output il valore null, poiché null non viene convertito in text.

Questa porzione di codice è la più problematica (a mio avviso):

Codice: Seleziona tutto

fattore2 = Table.AddColumn (fattore, "FattoreGG",
Tu hai definito una udf che chiami fattore, la quale utilizza come argomenti due campi testuali, sito e mese, e come output ti riporta una tabella. Il risultato di questa funzione lo avrai solo al termine, dopo "in" di chiusura, pertanto come fai ad utilizzarlo come argomento di una funzione definita al suo interno?

Inoltre se tu applichi questa funzione alla tua query Dati_Meteo_GG, metti anche caso che funzioni, come output tu avresti una tabella, da dover poi espandere, per ogni riga :?: .

Comunque io proverei a scriverla in questo modo:

Codice: Seleziona tutto

(sito as text, mese as text) as number =>

    let 
    a =
        if List.Contains({"Bolzano", "Brescia", "Carmagnola", "Stura", "Torino", "Suzzara", "Verrone/Biella"}, sito) then "E" else 
        if List.Contains({"Foggia", "Melfi", "Atessa"}, sito) then  "D" else
        if List.Contains({"Cassino", "Pomigliano", "Termoli"}, sito) then  "C" else 
        "",
    b = 
        if mese = "Gennaio" then 1 
        else if mese = "Febbraio" then 1 
        else if mese = "Marzo" then 1
        else if mese = "Aprile" and List.Contains({"E", "D"}, a) then 0.5
        else if mese = "Aprile" and a = "C" then 0
        else if mese = "Maggio" then 0
        else if mese = "Giugno" then 0
        else if mese = "Luglio" then 0
        else if mese = "Agosto" then 0
        else if mese = "Settembre" then 0
        else if mese = "Ottobre" and a = "E" then 0.5
        else if mese = "Ottobre" and List.Contains({"C", "D"}, a) then 0
        else if mese = "Novembre" and List.Contains({"E", "D"}, a) then 1
        else if mese = "Novembre" and a = "C" then 0.5
        else if mese = "Dicembre" then 1
        else 0
    in
        b
Prova a controllare se l'output è quello desiderato. Questa è una funzione personalizzata pertanto dovrai aggiungerla alla query con un passaggio del tipo (La funzione l'ho chiamata Your_Sito):

Codice: Seleziona tutto

    #"Funzione personalizzata richiamata" = Table.AddColumn(#"Rimosse colonne1", "Your_Sito", each Your_Sito([Sito], [Mese]))
A presto,
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
simonas
Messaggi: 16 | Topic creati
Iscritto il: gio 25 feb 2021, 11:31
Ringraziato: 1 volta

Colonna condizionale con doppia condizione

Messaggio da simonas »

Ciao!
Intanto grazie mille della pazienza, ho fatto un po' di casini con la funzione in effetti sia perché non conosco bene la struttura e la sintassi sia perché ad un certo punto ho fatto la cosa sbagliata di cambiare pezzetti ogni volta che mi dava un errore, quindi ho aggiunto cose tipo "else " che non hanno senso.

Comunque sì, così funziona perfettamente come intendevo, grazie!
Ad ogni modo sono d'accordo che l'opzione di usare una tabella nascosta è migliore sotto molti punti di vista, quindi vedo un po' se riesco a fare così.

Grazie di nuovo!
Rispondi