Colonne calcolate basate sulle condizioni
Quando si calcolano colonne, può essere necessario ottenere risultati diversi per un'espressione in base al verificarsi o meno di specifiche condizioni. Nelle espressioni è possibile impostare condizioni utilizzando le funzioni logiche If() o Case().
If()
Quando si utilizza la funzione If(), si specifica una condizione che può essere vera o falsa e poi si definisce cosa dev'essere restituito se la condizione è vera e cosa se la condizione è falsa.
Esempi
L'espressione
If(([Amount]<10),"low","high")
significa che se un valore di riga nella colonna "Amount" è minore di 10, come risultato viene restituita la stringa "low", mentre se il valore è maggiore o uguale a 10 viene restituita la stringa "high".
La condizione è illustrata di seguito:
In altre parole, la funzione If() divide le righe in due gruppi; un gruppo composto dalle righe per cui la condizione specificata è vera (restituendo come risultato "low") e l'altro composto dalle righe per cui la condizione specificata è falsa (restituendo come risultato "high").
Se i valori da restituire sono valori aggregati, i due gruppi saranno gestiti separatamente. Questo viene esemplificato dall'espressione aggiunta nella tabella seguente
If(([Amount]<10),Avg([Amount]),Avg([Amount]))
che contiene le aggregazioni delle medie. In questo caso, per entrambi i gruppi è specificata la stessa aggregazione, ma è possibile utilizzare aggregazioni differenti.
Per i valori di riga inferiori a 10, ovvero il gruppo "true", viene restituita la media 6 ((5+7)/2), mentre per il gruppo "false" viene restituita la media 13 ((14+10+15)/3).
La funzione if() può essere utilizzata anche in combinazione con and o or. Per spiegarlo, si consideri l'espressione
If(([Customer age]<20) and ([Gender]="Female"),"girl","other")
che ha come risultato la seguente colonna calcolata aggiunta:
Case()
Per definire un'espressione i cui risultati delle condizioni non siano limitati solo a vero o falso, è possibile utilizzare la funzione case().Case() può essere utilizzata in due forme differenti, entrambe descritte con gli esempi seguenti.
Esempio 1
Si considerino i libri e i video seguenti i cui prezzi sono stati ridotti rispettivamente del 10% e del 50%, e la sopraggiunta necessità di aggiornare l'elenco dei prezzi.
Poiché la riduzione differisce in base al tipo di prodotto, per calcolare i nuovi prezzi viene utilizzata un'espressione case():
case [Type] when "Book" then [Price]*0.9 when "Video" then [Price]*0.5 else [Price] end
La funzione case() controlla semplicemente "Type" rispetto a ciascuna opzione when nell'espressione.
Esempio 2
Nel secondo esempio, case() è utilizzata per valutare i risultati del test per alcuni studenti. I livelli previsti per la valutazione sono tre; Failed (totale minore di 100), Passed ed Excellent (totale maggiore o uguale a 160).
In questo esempio, la funzione Case() valuta le condizioni in maniera indipendente per ogni opzione when:
case when ([Test A] + [Test B])<100 then "Failed" when ([Test A] + [Test B])>=160 then "Excellent" else "Passed" end
Ciò consente di implementare condizioni più complesse rispetto all'esempio 1.
Di seguito viene mostrata la colonna calcolata risultante:
Ordine di esecuzione delle condizioni
Le diverse parti delle espressioni case() vengono eseguite nell'ordine di comparizione, ovvero dalla prima all'ultima. Vedere l'espressione seguente e la colonna risultante:
case when [Number]<40 then "yes" when [Number]<70 then "no" else "x" end
I numeri minori di 40 vengono impostati su "yes" e non vengono modificati. La parte successiva dell'espressione, che imposta i numeri minori di 70 su "no", influisce solo sulle righe rimanenti.