EgoRusMarch
@EgoRusMarch
C++ Developer

MySQL. Как избавится от косяков при применении GROUP BY + JOIN?

Дана БД second_material (фирма вторсырья, БД учебная):
d2839952121a463e954c3a3be023b76b.pngЗадание:
Написать запрос с выходными данными (point, date, out, inc, diff), в котором каждому пункту за каждую дату соответствует одна строка. В этой задаче требуется данные из двух таблиц собрать в одном результирующем наборе; при этом приход и расход денег на пункте приема в один и тот же день должны находиться в одной строке.

Вот содержимое таблицы income:
mysql> select * from income where _point = 7;
+-------+--------+------------+-----------+
| code  | _point | _date      | _inc      |
+-------+--------+------------+-----------+
| 00010 |    007 | 2010-03-08 | 120000.00 |
| 00011 |    007 | 2010-03-08 |  80000.00 |
| 00012 |    007 | 2010-03-08 |  20000.00 |
| 00013 |    007 | 2010-04-15 |  90000.00 |
| 00014 |    007 | 2010-05-05 |  40000.00 |
| 00015 |    007 | 2010-06-12 |  65000.00 |
+-------+--------+------------+-----------+

Вот содержимое таблицы outcome:
mysql> select * from outcome where _point = 7;
+-------+--------+------------+-----------+
| code  | _point | _date      | _out      |
+-------+--------+------------+-----------+
| 00010 |    007 | 2010-03-08 | 115000.00 |
| 00011 |    007 | 2010-03-08 |  77800.00 |
| 00012 |    007 | 2010-03-08 |  19900.00 |
| 00013 |    007 | 2010-04-15 |  84750.00 |
| 00014 |    007 | 2010-05-05 |  35500.00 |
| 00015 |    007 | 2010-06-12 |  61100.00 |
+-------+--------+------------+-----------+


Вот, что я написал:
SELECT income._point, income._date, @a:=SUM(income._inc) AS income,
       @b:=SUM(outcome._out) AS outcome, @a-@b AS diff
FROM income INNER JOIN outcome
     ON (income._date = outcome._date AND income._point = outcome._point)
GROUP BY income._date, outcome._date HAVING income._point = 7;

Просуммировав поля income и outcome по дате он умножил еще эту сумму на количество повторяющихся записей. И так во всей таблице.
Кроме того, поле diff выводит один и тот же результат во всей таблице.

Вот, что получилось:
mysql> source C:/SQL/Lab_8/queries/exercise_1.sql;
+--------+------------+-----------+-----------+------+
| _point | _date      | income    | outcome   | diff |
+--------+------------+-----------+-----------+------+
|    007 | 2010-03-08 | 660000.00 | 638100.00 | 4500 |
|    007 | 2010-04-15 |  90000.00 |  84750.00 | 4500 |
|    007 | 2010-05-05 |  40000.00 |  35500.00 | 4500 |
|    007 | 2010-06-12 |  65000.00 |  61100.00 | 4500 |
+--------+------------+-----------+-----------+------+

Если убрать агрегатную функцию SUM, то все выводит нормально за исключением того, что он выводит только первую попавшуюся запись без суммирования.
Что я не так делаю?
  • Вопрос задан
  • 316 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы