条件に基づく計算カラム
カラムを計算するときに、特定の条件が満たされているかどうかに応じて式の結果を変えることができます。条件は式の中で論理関数 If()
または Case()
を使用して設定できます。
If()
If()
関数を使用する場合、true または false のどちらかになる条件と、その条件が true または false の場合にそれぞれ何を返すかを指定します。
例
以下の式があるとします。
If(([Amount]<10),"low","high")
これは、[Amount] カラムのローの値が 10 未満の場合は結果として「low」が返され、値が 10 以上の場合は「high」が返されます。
以下に例を示します。
![](../../images/if_simple.png)
つまり If()
関数はローを 2 つのグループに分割します。1 つは、指定した条件が true となる (結果として「low」を返す) ローが含まれるグループ、もう 1 つは指定した条件が false となる (結果として「high」を返す) ローが含まれるグループです。
返される値が集計値の場合、2 つのグループが別々に処理されます。以下のテーブルに、次の式が追加された例を示します。
If(([Amount]<10),Avg([Amount]),Avg([Amount]))
ここには、集計の平均が含まれています。両方のグループに同じ集計が指定されていますが、異なる集計を使用することもできます。
![](../../images/if_simple_2.png)
ローの値が 10 未満、すなわち「true」グループの場合は平均値 6 が返され ((5+7)/2)、「false」グループの場合は平均値 13 ((14+10+15)/3) が返されます。
if()
関数は、and
または or
と組み合わせて使用することもできます。たとえば、次の式があるとします。
If(([Customer age]<20) and ([Gender]="Female"),"girl","other")
この式を実行すると、次のように計算カラムが追加されます。
![](../../images/if_and_example.png)
Case()
条件の結果が true または false に限定されない式を作成する場合は、case()
関数を使用できます。Case()
は、次の例に示すように 2 つの異なる形式で使用できます。
例 1
以下のように、書籍の価格が 10%、ビデオの価格が 50% 値下げになり、価格表の更新が必要になったとします。
![](../../images/case_simple_1.png)
商品によって値下げの割合が異なるため、ここでは case()
を使用して新しい価格を計算します。
case [Type]
when "Book" then [Price]*0.9
when "Video" then [Price]*0.5
else [Price]
end
![](../../images/case_simple_2.png)
ここで case()
は、単純に式の when
オプションごとに [Type] をチェックします。
例 2
2 つ目の例では、case()
を使用して学生の試験結果を評価します。評価レベルには、Failed (合計 100 点未満)、Passed、Excellent (合計 160 点以上) の 3 種類があります。
![](../../images/case_searched_1.png)
この例の Case()
は、when
オプションごとに条件を個別に評価します。
case
when ([Test A] + [Test B])<100 then "Failed"
when ([Test A] + [Test B])>=160 then "Excellent"
else "Passed"
end
このように、例 1 よりも複雑な条件を実装できます。
結果の計算カラムを下に示します。
![](../../images/case_searched_2.png)
case()
の場合も、複数の when
/then
条件を式に含めることができます。条件の実行順序
case()
式の各部分は、上から下の順に実行されます。以下の式と生成されるカラムを参照してください。
case
when [Number]<40 then "yes"
when [Number]<70 then "no"
else "x"
end
![](../../images/case_order_evaluation.png)
つまり、40 未満の数字は「yes」に設定され、その後は変更されません。式の次の部分では 70 未満の数字が「no」に設定され、これは残りのローにのみ影響します。