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 开头的卡都可以被视为大来卡,除了那些以 37 开头的 AMEX 卡。

像这样扩展上述查询似乎是一个完整的 hack

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

除了前两位数字与特殊情况匹配外,是否有一种优雅的方式在所有情况下都按第一位数字进行分组?

如果有人想帮忙,我也不知道如何命名这个问题......

编辑:我把 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 回答