حالة SQL المعاملات على طول متغير Input_expression

StackOverflow https://stackoverflow.com/questions/1239759

  •  11-09-2019
  •  | 
  •  

سؤال

لا بد لي من إنتاج تقرير مخصص عن عدد المعاملات المصنوعة من أنواع بطاقات الائتمان المختلفة. لأغراض التقرير، من الجيد افتراض أن جميع بطاقات الائتمان التي تبدأ ب 4 بطاقات التأشيرة وأن تلك التي تبدأ ب 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

هل هناك طريقة أنيقة للتجميع حسب الرقم الأول في جميع الحالات إلا أين تطابق أول رقمين من القضية الخاصة؟

ليس لدي أيضا أي فكرة عن كيفية لقب هذا السؤال إذا كان أي شخص يريد مساعدة ...

تعديل: كان لدي قيم ماستركارد وفيزا مختلطة، لذلك فقط أن أكون صحيحا :)

هل كانت مفيدة؟

المحلول

يمكنك القيام ببيانات الحالة مثل ما يلي:

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 هي بالضبط، حتى تتمكن من تداها:

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