質問

さまざまなクレジットカードタイプで作成されたトランザクションの数に関するアドホックレポートを作成する必要があります。レポートの目的のために、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
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top