MySQL – Subtrahieren bestimmter Zeilen einer Tabelle und Präsentieren der Ergebnisse neben anderen Zeilen

StackOverflow https://stackoverflow.com/questions/4492992

Frage

Ich habe schon seit Stunden damit zu kämpfen, diese Abfrage richtig zu stellen.Ich habe eine riesige Datenmenge und möchte nur die Abteilungen mit den IDs 10,15,18 und 25 anzeigen.Von hier aus möchte ich die Gewinne für jede Abteilung mit der ID 18 von 15 abziehen, d. h.15-18.

Ich filtere die Daten mit der folgenden Abfrage:

SELECT * FROM deptTable WHERE ID IN(10,15,18,25) AND date = '25.01.2009'

Abt. ---------- Datum ---------------- ID ----------------- Gewinn
Großbritannien ---------- 25.01.2009 ---------- 10 ---------------- 2000
Brasilien ------- 25.01.2009 ---------- 10 ---------------- 1300
Japan------- 25.01.2009 --------- 10 ---------------- 2500
Spanien------- 25.01.2009 ---------- 10 ---------------- 3200
Großbritannien ---------- 25.01.2009 ---------- 15 ---------------- 4000
Brasilien ------- 25.01.2009 ---------- 15 ---------------- 1700
Japan------- 25.01.2009 ---------- 15 ---------------- 3500
Spanien-------- 25.01.2009 ---------- 15 --------------- 1200
Großbritannien ---------- 25.01.2009 ---------- 18 ---------------- 2500
Brasilien ------- 25.01.2009 ---------- 18 ---------------- 1300
Japan------- 25.01.2009 --------- 18 ---------------- 2120
Spanien------- 25.01.2009 ---------- 18 ---------------- 800

Großbritannien ---------- 25.01.2009 ---------- 25 ---------------- 3000
Brasilien ------- 25.01.2009 ---------- 25 ---------------- 1850
Japan------- 25.01.2009 --------- 25 ---------------- 1580
Spanien-------- 25.01.2009 ---------- 25 --------------- 1070

Im Grunde möchte ich dann jede Zeile mit der ID 18 von den Zeilen mit der ID 15 subtrahieren.Nehmen wir das Vereinigte Königreich als Beispiel:

4000 - 2500 = 1500. Wenn Sie die übrigen Abteilungsbereiche bearbeiten, erhalten Sie das gewünschte Ergebnis:

Abt. ---------- Datum ---------------- ID ----------------- Gewinn
Großbritannien ---------- 25.01.2009 ---------- 10 ---------------- 2000
Brasilien ------- 25.01.2009 ---------- 10 ---------------- 1300
Japan------- 25.01.2009 --------- 10 ----------------- 2500
Spanien------- 25.01.2009 ---------- 10 ---------------- 3200
Großbritannien ---------- 25.01.2009 ---------- 15-18 ------------ 1500
Brasilien ------- 25.01.2009 ---------- 15-18 ------------ 400
Japan------- 25.01.2009 ---------- 15-18 ----------- 1380
Spanien-------- 25.01.2009 ---------- 15-18 ----------- 400

Großbritannien ---------- 25.01.2009 ---------- 25 ---------------- 3000
Brasilien ------- 25.01.2009 ---------- 25 ---------------- 1850
Japan------- 25.01.2009 ---------- 25 ---------------- 1580
Spanien-------- 25.01.2009 ---------- 25 --------------- 1070

2 Punkte:
1.Die berechnete Zeilen-ID-Spalte muss nicht „15-18“ lauten, ich habe nur „15-18“ eingegeben, um das Problem zu erklären
2.Die kursiv/fett gedruckten Zeilen sind die einzigen berechneten Zeilen, alle anderen Zeilen bleiben gleich

Sicherlich ist so etwas möglich?

Danke,

War es hilfreich?

Lösung

Ich denke, dass so etwas funktionieren wird ...

SELECT a.dept, a.date, IF(a.id=15,'15-18',a.id) AS id, IF(b.profit IS NULL,a.profit,a.profit-b.profit) AS profit
FROM deptTable a 
LEFT JOIN deptTable b ON a.ID=15 AND b.ID=18 AND a.dept=b.dept
WHERE a.ID IN(10,15,25) AND a.date = '2009-01-25' 

Getestetes Ergebnis:

+--------+------------+-------+--------+
| dept   | date       | id    | profit |
+--------+------------+-------+--------+
| UK     | 2009-01-25 | 10    |   2000 |
| Brazil | 2009-01-25 | 10    |   1300 |
| JAPAN  | 2009-01-25 | 10    |   2500 |
| SPAIN  | 2009-01-25 | 10    |   3200 |
| UK     | 2009-01-25 | 15-18 |   1500 |
| Brazil | 2009-01-25 | 15-18 |    400 |
| JAPAN  | 2009-01-25 | 15-18 |   1380 |
| SPAIN  | 2009-01-25 | 15-18 |    400 |
| UK     | 2009-01-25 | 25    |   3000 |
| Brazil | 2009-01-25 | 25    |   1850 |
| JAPAN  | 2009-01-25 | 25    |   1580 |
| SPAIN  | 2009-01-25 | 25    |   1070 |
+--------+------------+-------+--------+
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top