【发布时间】:2009-08-06 15:41:07
【问题描述】:
我必须制作一份关于使用不同信用卡类型进行的交易数量的临时报告。出于报告的目的,可以假设所有以 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 开头的那些是美国运通卡。
像这样扩展上述查询似乎是一个完整的黑客攻击
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 的值弄混了,所以只是正确的 :)
【问题讨论】:
-
这个答案几乎让我的问题看起来很傻,不敢相信我从来没有见过这个。谢谢。