MySQL - Вычитание определенных рядов таблицы и представление результатов вместе с другими рядами
-
12-10-2019 - |
Вопрос
Я боролся с тем, чтобы сделать этот запрос прямо сейчас. У меня огромное количество данных, и я хочу показать только отделы с IDS 10,15,18 и 25. Отсюда я хочу вычесть прибыль для каждого отдела с ID 18 из 15, то есть 15-18.
Я фильтрую данные со следующим запросом:
Выберите * из depttable, где ID в (10,15,18,25) и дате = '2009-01-25'
Департамент ---------- Дата ---------------- ID ----------------- Прибыль
Великобритания ---------- 2009-01-25 ---------- 10 ---------------- 2000
Бразилия ------- 2009-01-25 ---------- 10 ---------------- 1300
Япония ------- 2009-01-25 --------- 10 ---------------- 2500
Испания ------- 2009-01-25 ---------- 10 ---------------- 3200
Великобритания ---------- 2009-01-25 ---------- 15 ---------------- 4000
Бразилия ------- 2009-01-25 ---------- 15 ---------------- 1700
Япония ------- 2009-01-25 ---------- 15 ---------------- 3500
Испания -------- 2009-01-25 ---------- 15 --------------- 1200
Великобритания ---------- 2009-01-25 ---------- 18 ---------------- 2500
Бразилия ------- 2009-01-25 ---------- 18 ---------------- 1300
Япония ------- 2009-01-25 --------- 18 ---------------- 2120
Испания ------- 2009-01-25 ---------- 18 ---------------- 800
Великобритания ---------- 2009-01-25 ---------- 25 ---------------- 3000
Бразилия ------- 2009-01-25 ---------- 25 ---------------- 1850
Япония ------- 2009-01-25 --------- 25 ---------------- 1580
Испания -------- 2009-01-25 ---------- 25 --------------- 1070
То, что я в основном хочу, - это вычесть каждую строку с помощью ID 18 из рядов с ID 15. Примером Великобритании:
4000 - 2500 = 1500, делая остальные регионы департамента, даст желаемый результат, который есть:
Департамент ---------- Дата ---------------- ID ----------------- Прибыль
Великобритания ---------- 2009-01-25 ---------- 10 ---------------- 2000
Бразилия ------- 2009-01-25 ---------- 10 ---------------- 1300
Япония ------- 2009-01-25 --------- 10 ----------------- 2500
Испания ------- 2009-01-25 ---------- 10 ---------------- 3200
Великобритания ---------- 2009-01-25 ---------- 15-18 ------------ 1500
Бразилия ------- 2009-01-25 ---------- 15-18 ------------ 400
Япония ------- 2009-01-25 ---------- 15-18 ----------- 1380
Испания -------- 2009-01-25 ---------- 15-18 ----------- 400
Великобритания ---------- 2009-01-25 ---------- 25 ---------------- 3000
Бразилия ------- 2009-01-25 ---------- 25 ---------------- 1850
Япония ------- 2009-01-25 ---------- 25 ---------------- 1580
Испания -------- 2009-01-25 ---------- 25 --------------- 1070
2 балла:
1. Столбец идентификатора вычисленных строк не должен читать '15 -18 ', я только что напечатал 15-18', чтобы помочь объяснить проблему
2. курсив/жирный жирный собой - единственные рассчитанные строки, все остальные ряды остаются прежними
Конечно, что -то подобное возможно?
Спасибо,
Решение
Я думаю, что что -то подобное сработает ...
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'
Протестированный результат:
+--------+------------+-------+--------+
| 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 |
+--------+------------+-------+--------+