Как правильно получить суммирующую таблицу из двух?

Здравствуйте, есть две таблички.

ПРИХОДЫ     
валюта      приход                          
USD          1000                                  
USD	     2000
RUB	     1500
RUB           500

РАСХОДЫ
валюта     расход
USD         100
RUB         300
RUB         2000


Подскажите, как получить из них вот такую таблицу ?

ДВИЖЕНИЯ
ВАЛЮТА               ПРИХОДОБЩИЙ             РАСХОДОБЩИЙ          ОСТАТОК
USD                      3000                           100              2900
RUb                       2000                          2300             300


Понимаю, что нужно использовать соединение (внешнее?) по валюте, по ней же и сгруппировать, и просуммировать приходы и расходы, однако не получается это сделать в SQL

Извиняюсь за косую табличку.
  • Вопрос задан
  • 2920 просмотров
Решения вопроса 1
@kfuntov
Все валюты есть в обоих таблицах? Или какой-то из валют где-то может не быть?
Если в ПРИХОДАХ есть все виды валют, то можно так:
SELECT
       p.валюта as ВАЛЮТА,
       p.tot as ПРИХОДОБЩИЙ,
       r.tot as РАСХОДОБЩИЙ,
       (p.tot - r.tot) as ОСТАТОК
FROM 
    ( SELECT SUM(приход) as tot, валюта FROM ПРИХОДЫ GROUP BY валюта ) as p
  LEFT JOIN 
      ( SELECT SUM(расход) as tot, валюта FROM РАСХОДЫ GROUP BY валюта ) as r
     ON r.валюта = p.валюта


Если в "ПРИХОДАХ" может не быть каких-то валют,то нужен FULL JOIN, вместо LEFT.
MySQL его сама не умеет, но способов его реализовать несколько, например:
UNION LEFT и RIGHT JOIN-ов - самый короткий/понятный/красивый вариант, но при большом количестве валют может начать тормозить, так как UNION делает сортировку.
SELECT
       p.валюта as ВАЛЮТА,
       p.tot as ПРИХОДОБЩИЙ,
       r.tot as РАСХОДОБЩИЙ,
       (p.tot - r.tot) as ОСТАТОК
FROM 
    ( SELECT SUM(приход) as tot, валюта FROM ПРИХОДЫ GROUP BY валюта ) as p
  LEFT JOIN 
      ( SELECT SUM(расход) as tot, валюта FROM РАСХОДЫ GROUP BY валюта ) as r
     ON r.валюта = p.валюта
UNION
SELECT
       p.валюта as ВАЛЮТА,
       p.tot as ПРИХОДОБЩИЙ,
       r.tot as РАСХОДОБЩИЙ,
       (p.tot - r.tot) as ОСТАТОК
FROM 
    ( SELECT SUM(приход) as tot, валюта FROM ПРИХОДЫ GROUP BY валюта ) as p
  RIGHT JOIN 
      ( SELECT SUM(расход) as tot, валюта FROM РАСХОДЫ GROUP BY валюта ) as r
     ON r.валюта = p.валюта

Если производительность в данном месте требует оптимизации (советую сильно подумать, прежде, чем отвечать "да"), то можно усложнять запрос, делая его быстрее.
Например, заменить UNION на UNION ALL и во второй части не выбирать значения, которые есть в первой.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы