MySQL - soustraire certaines lignes d'un tableau et présenter les résultats avec d'autres lignes
-
12-10-2019 - |
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,
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 |
+--------+------------+-------+--------+