Как научиться решать такие задачи по sql?

Схема базы данных
Фирма имеет несколько пунктов приема вторсырья. Каждый пункт получает деньги для их выдачи сдатчикам вторсырья. Сведения о получении денег на пунктах приема записываются в таблицу: Income_o(point, date, inc) Первичным ключом является (point, date). При этом в столбец date записывается только дата (без времени), т.е. прием денег (inc) на каждом пункте производится не чаще одного раза в день. Сведения о выдаче денег сдатчикам вторсырья записываются в таблицу: Outcome_o(point, date, out) В этой таблице также первичный ключ (point, date) гарантирует отчетность каждого пункта о выданных деньгах (out) не чаще одного раза в день.
Задача
В предположении, что приход и расход денег на каждом пункте приема фиксируется не чаще одного раза в день [т.е. первичный ключ (пункт, дата)], написать запрос с выходными данными (пункт, дата, приход, расход). Использовать таблицы Income_o и Outcome_o.
Решение

SELECT t1.point, t1.date, inc, out
FROM income_o t1 LEFT JOIN outcome_o t2 ON t1.point = t2.point
AND t1.date = t2.date
UNION
SELECT t2.point, t2.date, inc, out
FROM income_o t1 RIGHT JOIN outcome_o t2 ON t1.point = t2.point
AND t1.date = t2.date

Решение не очевидное, задача сложная.
Как научиться решать такие сложные задачи по sql?
т.е. с основами sql я знаком, знаю как строить подзапросы, соединять таблицы join, union,
но иногда задачи подобные этой сложно решить.
Есть ли учебник, где на пальцах объясняются алгоритмы sql и способы решения для новичков?

P.S.

SELECT point, date, sum(inc) inc, sum(out) out
  FROM (
    SELECT point, date, inc, NULL out
      FROM income_o
    UNION ALL
    SELECT point, date, NULL, out
      FROM outcome_o
  ) x
 GROUP BY point, date

Ответы (0 шт):