MySQL - soustraire certaines lignes d'un tableau et présenter les résultats avec d'autres lignes

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

Question

J'ai du mal à répondre correctement à cette requête depuis des heures maintenant.J'ai une énorme quantité de données et je souhaite afficher uniquement les départements avec les ID 10, 15, 18 et 25.À partir de là, je veux soustraire les bénéfices de chaque département avec l'ID 18 de 15, c'est-à-dire15-18.

Je filtre les données avec la requête suivante :

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

département ---------- date ---------------- ID ----------------- profit
Royaume-Uni ---------- 2009-01-25 ---------- 10 ---------------- 2000
Brésil ------- 2009-01-25 ---------- 10 ---------------- 1300
Japon------- 2009-01-25 --------- 10 ---------------- 2500
Espagne------- 2009-01-25 ---------- 10 ---------------- 3200
Royaume-Uni ---------- 2009-01-25 ---------- 15 ---------------- 4000
Brésil ------- 2009-01-25 ---------- 15 ---------------- 1700
Japon------- 2009-01-25 ---------- 15 ---------------- 3500
Espagne-------- 2009-01-25 ---------- 15 --------------- 1200
Royaume-Uni ---------- 2009-01-25 ---------- 18 ---------------- 2500
Brésil ------- 2009-01-25 ---------- 18 ---------------- 1300
Japon------- 2009-01-25 --------- 18 ---------------- 2120
Espagne------- 2009-01-25 ---------- 18 ---------------- 800

Royaume-Uni ---------- 2009-01-25 ---------- 25 ---------------- 3000
Brésil ------- 2009-01-25 ---------- 25 ---------------- 1850
Japon------- 2009-01-25 --------- 25 ---------------- 1580
Espagne-------- 2009-01-25 ---------- 25 --------------- 1070

Ce que je veux essentiellement, c'est ensuite soustraire chaque ligne portant l'ID 18 des lignes portant l'ID 15.En prenant le Royaume-Uni comme exemple :

4000 - 2500 = 1500, faire le reste des régions départementales donnera le résultat souhaité qui est :

département ---------- date ---------------- ID ----------------- profit
Royaume-Uni ---------- 2009-01-25 ---------- 10 ---------------- 2000
Brésil ------- 2009-01-25 ---------- 10 ---------------- 1300
Japon------- 2009-01-25 --------- 10 ----------------- 2500
Espagne------- 2009-01-25 ---------- 10 ---------------- 3200
Royaume-Uni ---------- 2009-01-25 ---------- 15-18 ------------ 1500
Brésil ------- 2009-01-25 ---------- 15-18 ------------ 400
Japon------- 2009-01-25 ---------- 15-18 ----------- 1380
Espagne-------- 2009-01-25 ---------- 15-18 ----------- 400

Royaume-Uni ---------- 2009-01-25 ---------- 25 ---------------- 3000
Brésil ------- 2009-01-25 ---------- 25 ---------------- 1850
Japon------- 2009-01-25 ---------- 25 ---------------- 1580
Espagne-------- 2009-01-25 ---------- 25 --------------- 1070

2 points :
1.La colonne d'ID de lignes calculée n'a pas besoin d'être « 15-18 », je viens de taper « 15-18 » pour expliquer le problème.
2.Les italiques/gras sont les seules lignes calculées, toutes les autres lignes restent les mêmes

Quelque chose comme ça est sûrement possible ?

Merci,

Était-ce utile?

La solution

Je pense que quelque chose comme ça fonctionnera...

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' 

Résultat testé :

+--------+------------+-------+--------+
| 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 |
+--------+------------+-------+--------+
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top