2015-09-30 9 views
5

Ich möchte eine Abfrage haben, die den größeren von zwei Werten/Spalten verwendet, wenn ein bestimmter anderer Wert für den Datensatz wahr ist.Wählen Sie den Fall aus, der zwei Spalten vergleicht

Ich versuche, einen Bericht Konto Bestände zu bekommen. Leider speichert die DB in der Regel den Wert von Cash in einer Spalte HoldingQty, während für jede andere Art von Holding (Aktien, Anleihen, Investmentfonds) es in einer Spalte namens Qty speichert.

Das Problem ist, dass manchmal der Wert des Geldes nur in Qty gespeichert wird, und manchmal in Qty und HoldingQty. Offensichtlich ist es manchmal nur in HoldingQty wie oben erwähnt gespeichert.

Grundsätzlich möchte ich meine Select-Anweisung zu sagen "Wenn die Sicherheit Bargeld ist, schauen Sie sowohl Menge als auch Halten Menge und geben Sie mir den Wert von was größer ist. Andernfalls, wenn die Sicherheit nicht Bargeld ist, geben Sie mir einfach Menge" .

Wie würde ich das in T-SQL schreiben? Hier ist meine Mühe ist:

SELECT 
    h.account_name, h.security_name, h.security_type, h.price, 
    (CASE: 
     WHEN security_type = 'cash' 
      THEN (WHEN h.qty > h.holdingqty 
        THEN h.qty 
        ELSE h.holdingqty) 
     ELSE qty) as quantity, 
    h.total_value 
FROM 
    holdings h 
WHERE 
    ........... 
+0

Sie sind fast da mit Ausnahme der Syntax. –

+2

Verwenden Sie eine zusammengesetzte case-Anweisung 'case wenn security_Type = 'cash' und h.qty <= h.holdingqty dann h.holdingqty else h.qty end als menge 'das sagt im Grunde, wenn type bar ist und holdqty> oder gleich ist Menge verwenden Sie holdqty, sonst verwenden Sie Menge. Da wir wissen, wann es kein Bargeld ist, verwenden wir immer die Menge, ich änderte die Reihenfolge ein wenig, um die Case-Anweisung zu vereinfachen. – xQbert

+2

Seien Sie vorsichtig, wenn diese Spalten nullfähig sind. – shawnt00

Antwort

4

Ihre Anfrage korrekt ist, aber nur wenige Syntax Anordnung brauchen, versuchen Sie unter Code

SELECT h.account_name, h.security_name, h.security_type, h.price, 
    CASE WHEN security_type = 'cash' then 
            CASE when h.qty > h.holdingqty then h.qty 
             else h.holdingqty END 
    ELSE qty END AS 'YourColumnName' 
) as quantity, h.total_value 
FROM holdings h 
where ........... 
+0

Danke für Ihre Hilfe! –

2

Fast da!

SELECT h.account_name , 
     h.security_name , 
    h.security_type , 
    h.price , 
    CASE WHEN security_type = 'cash' 
     THEN CASE WHEN h.qty > h.holdingqty THEN h.qty 
        ELSE h.holdingqty 
       END 
     ELSE qty 
    END AS quantity , 
    h.total_value 
FROM holdings h 
WHERE ........... 
+0

Danke für Ihre Hilfe! –

2

Sie können dieses Verhalten mit einem verschachtelten case Ausdruck erreichen:

SELECT h.account_name, h.security_name, h.security_type, h.price, 
     CASE security_type 
     WHEN 'cash' THEN CASE WHEN h.qty > h.holdingqty THEN h.qty 
                 ELSE h.holdingqty 
         END 
     ELSE h.qty 
     END 
FROM holdings h 
WHERE ........... 
+0

Danke für Ihre Hilfe! –

Verwandte Themen