2017-12-27 3 views
-2
------------------------------------------- 
| CustomerID | Action  | Amount | 
|-------------------------------------------| 
| 111  |  deposit |  100 | 
| 111  | withdrawl |  25 | 
| 222  |  deposit |  500 | 
| 222  |  deposit |  100 | 
| 333  | withdrawl |  100 | 
| 333  |  deposit |  100 | 
------------------------------------------- 

Schreiben Sie eine Abfrage, die für jeden customerID die Gesamt Amount für diesen Kunden angezeigt werden würde, wo Deposit Aktionen hinzugefügt werden, auf die Gesamt und Entnahmen werden abgezogen von insgesamtSQL Gesamtbetrag wo Einlagen hinzugefügt werden und withdrawls abgezogen

+1

Dieser schreit " Hausaufgaben ", zumindest die Anständigkeit, es anzuerkennen. – MatBailie

+0

das war nicht für die Hausaufgaben. Dies war für das persönliche Lernen – fdellagr

+0

@fdellagr, "Hausaufgaben" * ist * für persönliches Lernen ... –

Antwort

2

Wenn Sie CASE WHEN verwenden, können Sie die Spalte AMOUNT bei der Berechnung auf Grundlage des Wertes eines anderen Feldes (ACTION) unterschiedlich behandeln.

SELECT CUSTOMERID, 
SUM(CASE WHEN ACTION = 'DEPOSIT' THEN AMOUNT 
     WHEN ACTION = 'WITHDRAWL' THEN -AMOUNT ELSE 0 END) AS TOTAL_AMOUNT 
FROM 
TABLE1 
GROUP BY CUSTOMERID; 
+0

was ist, wenn ich ein laufendes Gleichgewicht halten will. Also, wenn ich will, dass Aktion in meine Select-Anweisung und Gruppe nach Anweisung hinzufügen? jede Idee – fdellagr

+0

'SUM (CASE ... END) ÜBER (PARTITION VON customerid ORDER BY some_other_column)' - In SQL-Dateien sind intrinsisch *** un-geordnete ***, so *** *** *** *** *** Sie müssen *** ein anderes Feld um alles zu bestellen. – MatBailie

0

Sie direkt IF - ELSE logic verwenden können (wenn withdrawl oder other "gibt es nur eine Alternative ist"), eine einfache Abfrage mithilfe DECODE Pseudo-Code zu schreiben:

select CustomerID "Customer ID", sum(decode(Action,'withdrawl',-Amount,Amount)) "Total Amount" 
    from inventory 
group by CustomerID 
order by CustomerID; 

D e m o

+0

Diese Antwort fügt alles zusammen und subtrahiert nicht zieht sich zurück – fdellagr

+1

@fdellagr nein, Sie können von Demo sehen, dass es subtracts zieht –

+0

@fdellagr - Dieser Teil stellt sicher, dass ''retrowl'' negativ ist, und alles andere ist positiv:' decode (Aktion, 'Zurückziehen', - Betrag, Betrag) ' – MatBailie

Verwandte Themen