0

さまざまな種類のクレジット カードで行われた取引の数に関するアドホック レポートを作成する必要があります。レポートの目的上、4 で始まるクレジット カードはすべて VISA カードであり、5 で始まるクレジット カードは MasterCard であると想定しても問題ありません。

このクエリは、上記の違いに対してうまく機能します。

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 で始まるカードを除いて、Diners Club カードと見なすことができます。

上記のクエリをこのように拡張すると、完全なハックのように見えます

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の値が混同されていたので、正しいように:)

4

4 に答える 4

5

次のような case ステートメントを実行できます。

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
于 2009-08-06T15:45:39.697 に答える
2

システムについてはわかりませんが、Oracle CASE 式はまさにそれであるため、ネストできます。

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
于 2009-08-06T15:46:25.810 に答える
1

カード タイプ列をテーブルに格納し、FK をカード タイプ テーブルに格納するか、次のようなものを試すことができます。

CASE
    WHEN LEFT(pan,2)='37' then ...
    WHEN LEFT(pan,1)='3' then ...
    .....

編集
カードタイプの値をテーブルに保存することを本当に検討する必要があります。挿入時に一度決定すると、毎回これらのフープをジャンプすることなくデータをクエリできます。ある時点でアルゴリズムが変更された場合にも、自分自身を保護します。既存のデータはすべて正しくなります。

于 2009-08-06T15:46:01.193 に答える
1

個人的には、あなたの「手書き」の方法は、@ 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
于 2011-01-21T12:41:22.050 に答える