2015-05-28 12 views
5

Chcę poprawić następujący kod SQL, aby zapytanie wyświetliło typ karty (wiza, karta master itd.) Jako PaymentMethod zamiast karty kredytowej.Opisy przypadków z warunkami warunkowymi w serwerze 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, 

Czy ktoś może wskazać mi właściwy kierunek. Próbowałem, dodając drugi warunkowy do mojego rachunku przypadek, ale nie udaje się „nieznane” dla wszystkich rodzajów płatności o 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, 

Z góry dziękuję za pomoc.

+7

Brzmi jak 'pm.CardTypeMId' nie może być 1, 2, 3 lub 4? – LittleBobbyTables

+0

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

+2

Wygląda dobrze dla mnie, zgodna z ANSI SQL. (Wypróbuj CASE w zewnętrznych CASE, jeśli 3 to.) – jarlh

Odpowiedz

11

Możesz uprościć to całkiem sporo.

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

dziękuję, że ma wiele sensu:) Doceniam twoją pomoc –

+2

możesz * możesz * uprościć to w ten sposób, ale ich pierwotne zapytanie jest poprawne pod względem składni, więc jeśli 'pm. CardTypeMId' nie ma wartości 1-4, nadal zwraca wartość 'NULL'. Nie wiem, dlaczego ma tak wiele przebojów, gdy tak naprawdę nie rozwiązuje głównego problemu, ale myślę, że to przynajmniej potwierdziłoby, że wystąpił problem z danymi. – LittleBobbyTables

+0

Tak, oryginał jest poprawny pod względem składni. Nie jestem do końca pewien, dlaczego tak wiele zyskało na popularności. Nie wspomniałem nic o tym, czy pm.CardTypeMId nie pasuje, ponieważ zostało to już uwzględnione w komentarzach. Być może zobaczenie wartości NULL zamiast "Unknown" albo zapewnia pożądaną funkcjonalność, albo pozwala zobaczyć prawdziwy problem. –

0

Jest to prawdopodobnie spowodowane pm.CardTypeMId jest równe 1, 2 3 lub 4, gdy pm.PaymentType = 3.

Spróbuj WHEN pm.PaymentType = 3 THEN 'Visa' dla linii Visa

2

Można używać zagnieżdżonych CASE

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

Wydaje się oczywiste, że nie przechodzą w 1, 2, 3 lub 4 pm.CardTypeID. Należy zatem dodać klauzulę innego, aby złapać tego, jak poniżej:

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