我必须就不同信用卡类型进行的交易数量进行临时报告。出于报告的目的,可以假设所有以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次开头的卡都可以视为食客俱乐部卡,除了那些以37个为Amex卡的纸牌。

扩展上述查询似乎是一个完整的黑客

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的价值观混合在一起,所以要正确:)

有帮助吗?

解决方案

您可以按以下方式执行案例语句:

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