可変長い入力_ExpressionでSQLケースを取引します
質問
さまざまなクレジットカードタイプで作成されたトランザクションの数に関するアドホックレポートを作成する必要があります。レポートの目的のために、4から始まるすべてのクレジットカードはビザカードであり、5で始まるものがマスターカードであると仮定するのは問題ありません。
このクエリは、上記の区別に適しています。
select card_type =
case substring(pan,1,1)
when '4' then 'VISA'
when '5' then 'MasterCard'
else 'unknown'
end,count(*),
sum(amount)
from transactions
group by card_type
しかし、私たちの状況では(これが世界中でどのように機能するかはわかりません)、3から始まるすべてのカードは、Amexカードである37から始まるものを除いて、ダイナークラブカードと見なすことができます。
このように上記のクエリを拡張する
select card_type =
case substring(pan,1,2)
when '30' then 'Diners'
...
when '37' then 'AMEX'
...
when '39' then 'Diners'
when '40' then 'VISA'
...
when '49' then 'VISA'
when '50' then 'MasterCard'
...
when '59' then 'MasterCard'
else 'unknown'
end,count(*),
sum(amount)
from transactions
group by card_type
最初の2桁が特別なケースと一致する場合を除き、すべての場合に最初の数字でグループ化するエレガントな方法はありますか?
また、どうすればいいのかわからない 題名 誰かが手伝いたいかどうかこの質問...
編集: :MasterCardとVisaの価値が混ざっていたので、正しくするためだけに:)
解決
次のようなケースステートメントを行うことができます。
select case
when substring(pan,1,2) = '37' then 'AMEX'
when substring(pan,1,1) = '3' then 'Diners'
when substring(pan,1,1) = '4' then 'Mastercard'
when substring(pan,1,1) = '5' then 'VISA'
else 'unknown'
end,
count(*),
sum(amount)
from transactions
group by card_type
他のヒント
あなたのシステムについてはわかりませんが、Oracleケースではまさにそれがまさにそれであるため、それらをネストすることができます。
case substring(pan,1,1)
when '3' then case substring(pan,2,1)
when '7' then 'Amex'
else 'Diners'
end
when '4' then 'VISA'
when '5' then 'MasterCard'
else 'unknown'
end
カードタイプの列をテーブルに、FKをカードタイプのテーブルに保存するか、次のようなものを試してみることができます。
CASE
WHEN LEFT(pan,2)='37' then ...
WHEN LEFT(pan,1)='3' then ...
.....
編集
カードタイプの値をテーブルに保存することを本当に検討する必要があります。挿入するときに一度それを決定してから、これらのフープを毎回ジャンプせずにデータを照会できます。また、ある時点でアルゴリズムが変更された場合、既存のデータはすべて正しい場合にも身を守ります
個人的には、あなたの「ロングハンド」の方法は、@samjudsonの答えを見つけるよりも読みやすく維持するのが簡単であるという点でエレガントだと思います(しかし、彼らのアプローチの魅力は見ています)。使用できます OR
ケースごとに複数の値をテストします。私は見つけます LIKE
読みやすいですが、それは私だけかもしれません;)例
CASE
WHEN card_type LIKE '37%'
THEN 'AMEX'
WHEN (
card_type LIKE '30%'
OR card_type LIKE '39%'
)
THEN 'Diners'
WHEN (
card_type LIKE '40%'
OR card_type LIKE '49%'
)
THEN 'VISA'
WHEN (
card_type LIKE '50%'
OR card_type LIKE '59%'
)
THEN 'MasterCard'
ELSE
'unknown'
END