Я должен подготовить специальный отчет о количестве транзакций, совершенных с различными типами кредитных карт. Для целей отчета можно предположить, что все кредитные карты, начинающиеся с 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, могут считаться картами Diners Club, кроме тех, которые начинаются с 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, поэтому, чтобы быть точным:)