MySQL - вычитание определенных строк таблицы и представление результатов вместе с другими строками - PullRequest
2 голосов
/ 20 декабря 2010

Я пытался получить этот запрос в течение нескольких часов.У меня огромное количество данных, и я хочу показать только отделы с идентификаторами 10,15,18 и 25. Отсюда я хочу вычесть прибыль для каждого отдела с идентификатором 18 из 15, то есть 15-18.

Я фильтрую данные по следующему запросу:

ВЫБРАТЬ * ОТ deptTable ГДЕ ВХОДЯЩИЙ (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
UK ---------- 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

UK ---------- 2009-01-25 ---------- 25 ---------------- 3000
Бразилия ------- 2009-01-25 ---------- 25 ---------------- 1850
Япония ------- 2009-01-25 --------- 25 ---------------- 1580
Испания -------- 2009-01-25 ---------- 25 --------------- 1070

В основном я хочу вычесть каждую строку с идентификатором 18 из строк с идентификатором 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.Курсив / полужирный - единственные рассчитанные строки, все остальные строки остаются неизменными

Конечно, что-то подобное возможно?

Спасибо,

1 Ответ

2 голосов
/ 20 декабря 2010

Я думаю, что-то вроде этого будет работать ...

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 |
+--------+------------+-------+--------+
...