2015-05-28 8 views
5

Ich möchte die folgende SQL optimieren, so dass die Abfrage den Kartentyp (Visa, Mastercard, etc) als PaymentMethod anstelle von Kreditkarte ausgeben wird.Case Statements mit Bedingungen in SQL Server

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, 

Kann mir bitte jemand in die richtige Richtung zeigen. Ich habe versucht, eine zweite Bedingung zu meinem Fall Anweisung hinzufügen, aber es funktioniert nicht, um ‚Unknown‘ für alle Zahlungsarten von 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, 

Sie für Ihre Hilfe Vielen Dank im Voraus.

+7

Klingt wie 'pm.CardTypeMId' möglicherweise nicht 1, 2, 3 oder 4? – LittleBobbyTables

+0

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

+2

Sieht für mich gut, ANSI SQL-konforme Syntax. (Versuchen Sie einen CASE in der äußeren CASE wenn 3 dann.) – jarlh

Antwort

11

Sie könnten das ziemlich vereinfachen.

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

Danke, das macht sehr viel Sinn:) Ich schätze Ihre Hilfe –

+2

Sie * können * es so vereinfachen, aber ihre ursprüngliche Abfrage ist syntaktisch korrekt, also wenn pm. CardTypeMId' hat keinen Wert von 1-4, es wird immer noch 'NULL' zurückgegeben. Ich bin mir nicht sicher, warum es so viele Upvotes gibt, wenn es nicht wirklich das Hauptproblem behandelt, aber ich denke, es würde zumindest bestätigen, wenn es ein Problem mit den Daten gibt. – LittleBobbyTables

+0

Ja, das Original ist syntaktisch korrekt. Bin mir auch nicht wirklich sicher, warum das so viele Upvotes hat. Ich habe nichts darüber erwähnt, ob pm.CardTypeMId nicht passt, da das bereits in den Kommentaren behandelt wurde. Vielleicht sieht NULL statt "Unbekannt" entweder die gewünschte Funktionalität oder lässt sie das eigentliche Problem erkennen. –

0

Es ist wahrscheinlich, weil pm.CardTypeMId-1, 2, 3 oder 4, wenn pm.PaymentType = 3 nicht gleich ist.

Probieren Sie WHEN pm.PaymentType = 3 THEN 'Visa' für die Visa Linie

2

können Sie verschachtelte CASE verwenden

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

Es scheint offensichtlich zu sagen, dass Sie nicht in 1, 2, 3 oder 4 bis pm.CardTypeID sind vorbei. Sie sollten daher eine else-Klausel fügen Sie diese wie unten zu fangen:

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