2015-05-28 11 views
5

Voglio modificare il seguente SQL in modo che la query restituisca il tipo di carta (visa, mastercard, ecc.) Come metodo di pagamento anziché carta di credito.Case statement con condizionale nel server SQL

CASE WHEN pm.PaymentType = 1 THEN 'Cash' 
     WHEN pm.PaymentType = 2 THEN 'Check' 
     WHEN pm.PaymentType = 3 THEN 'Credit Card' 
     WHEN pm.PaymentType = 4 THEN 'EFT' 
     WHEN pm.PaymentType = 5 THEN 'Money Order' 
     WHEN pm.PaymentType = 6 THEN 'Conveyance' 
     ELSE 'Unknown' 
     END AS PaymentMethod, 

Qualcuno può indicarmi la giusta direzione. Ho provato ad aggiungere un secondo condizionale per il mio caso dichiarazione, ma viene a mancare fuori a 'Unknown' per tutti i tipi di pagamento di 3.

CASE WHEN pm.PaymentType = 1 THEN 'Cash' 
     WHEN pm.PaymentType = 2 THEN 'Check' 
     WHEN pm.PaymentType = 3 and pm.CardTypeMId = 1 THEN 'American Express' 
     WHEN pm.PaymentType = 3 and pm.CardTypeMId = 2 THEN 'Discover' 
     WHEN pm.PaymentType = 3 and pm.CardTypeMId = 3 THEN 'Mastercard' 
     WHEN pm.PaymentType = 3 and pm.CardTypeMId = 4 THEN 'Visa' 
     WHEN pm.PaymentType = 4 THEN 'EFT' 
     WHEN pm.PaymentType = 5 THEN 'Money Order' 
     WHEN pm.PaymentType = 6 THEN 'Conveyance' 
     ELSE 'Unknown' 
     END AS PaymentMethod, 

vi ringrazio in anticipo per la vostra assistenza.

+7

Suona come 'pm.CardTypeMId' non può essere 1, 2, 3 o 4? – LittleBobbyTables

+0

IMO duplicato, http://stackoverflow.com/questions/3043154/combining-multiple-condition-in-single-case-statement-in-sql-server – Adam

+2

Mi sembra soddisfacente, sintassi ANSI SQL compatibile. (Prova un CASO nel caso CASE se 3 poi.) – jarlh

risposta

11

Si potrebbe semplificare questo un po '.

CASE pm.PaymentType 
    WHEN 1 THEN 'Cash' 
    WHEN 2 THEN 'Check' 
    WHEN 3 THEN 
     CASE pm.CardTypeMId 
      WHEN 1 THEN 'American Express' 
      WHEN 2 THEN 'Discover' 
      WHEN 3 THEN 'Mastercard' 
      WHEN 4 THEN 'Visa' 
     END 
    WHEN 4 THEN 'EFT' 
    WHEN 5 THEN 'Money Order' 
    WHEN 6 THEN 'Conveyance' 
    ELSE 'Unknown' 
END AS PaymentMethod 
+0

grazie che ha molto senso:) Apprezzo il tuo aiuto –

+2

tu * puoi * semplificarlo così, ma la loro query originale è sintatticamente corretta, quindi se 'pm. CardTypeMId' non ha un valore di 1-4, restituirà comunque 'NULL'. Non sono sicuro del motivo per cui questo ha così tanti upvotes quando non risolve il problema principale, ma suppongo che almeno confermerebbe se ci fosse un problema con i dati. – LittleBobbyTables

+0

Sì, l'originale è sintatticamente corretto. Non sono nemmeno sicuro del motivo per cui ci sono così tanti voti positivi. Non ho menzionato nulla sul fatto che pm.CardTypeMId non corrisponda poiché era già stato trattato nei commenti. Forse vedere NULL invece di "Unknown" fornisce la funzionalità che volevano o lascia loro vedere il vero problema. –

0

Probabilmente è perché pm.CardTypeMId non è uguale a 1, 2 3 o 4 quando pm.PaymentType = 3.

Basta provare WHEN pm.PaymentType = 3 THEN 'Visa' per la linea di Visa

2

È possibile utilizzare CASO nidificato

WHEN pm.PaymentType = 3 THEN 
Case 
    WHEN pm.CardTypeMId = 1 THEN 'American Express' 
    WHEN pm.CardTypeMId = 2 THEN 'Discover' 
    WHEN pm.CardTypeMId = 3 THEN 'Mastercard' 
    WHEN pm.CardTypeMId = 4 THEN 'Visa' 
    END as CreditCard 
0

Sembra ovvio dire che non sta passando in 1, 2, 3 o 4 per pm.CardTypeID. quindi si dovrebbe aggiungere una clausola else per la cattura di questo come di seguito:

Case pm.PaymentType 
    When 1 Then 'Cash' 
    When 2 Then 'Check' 
    When 4 Then 'EFT' 
    When 5 Then 'Money Order' 
    When 6 Then 'Conveyance' 
    When 3 Then Case pm.CardTypeMId 
        When 1 Then 'American Express' 
        When 2 Then 'Discover' 
        When 3 Then 'Mastercard' 
        When 4 Then 'Visa' 
          Else 'Other Credit Card' 
       End 
      Else 'Unknown' 
End As PaymentMethod