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").

Nota:

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:



Nota: In entrambe le forme di case(), nell'espressione è possibile includere condizioni when/then multiple.

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.