У меня есть две таблицы Доход (id, доход, дата, userid) и таблица Expense (id,amount,date,userid)
. Теперь я пытаюсь создать View с суммой дохода, суммы суммы в год. Также он должен быть GROUPED by year
и userid
.
Таким образом, новая таблица (представление) должна иметь сумму дохода, расходов, год. Прямо сейчас я застрял над этим кодом.
SELECT
id,
i.Prihod,
e.Rashod,
YEAR
YEAR(COALESCE(e.god, i.godi))) AS Godina ,
users_id
FROM
(
SELECT
sum(insum) as 'Prihod',
YEAR(datum) as 'Godi',
users_id
FROM
GROUP BY users_id
) as i
FULL OUTER JOIN
(
SELECT
sum(amount) as 'Rashod',
YEAR(datum) as 'God',
users_id
FROM expense
GROUP BY users_id
) as e
Это работа для структурированной части структурированного языка запросов. Начните с трех подзапросов (виртуальных таблиц).
Во-первых: список лет и пользователей. Вам это нужно, потому что MySQL не имеет возможности FULL OUTER JOIN
. Если вы правильно напишете этот запрос, он будет содержать одну строку для каждого пользователя за каждый год, который вам нужен.
SELECT DISTINCT YEAR(datum) Godi, users_id FROM income
UNION
SELECT DISTINCT YEAR(datum) Godi, users_id FROM expense
Во-вторых, резюме дохода по годам и пользователю.
SELECT sum(insum) as Prihod,
YEAR(datum) as Godi,
users_id
FROM income
GROUP BY YEAR(datum), users_id
В-третьих, аналогичная сумма расходов по годам и пользователю
SELECT sum(amount) as Rashod,
YEAR(datum) as God,
users_id
FROM expense
GROUP BY YEAR(datum), users_id
Затем проверьте эти подзапросы индивидуально, автономно, чтобы убедиться, что у вас есть ожидаемые результаты.
Наконец, соедините их вместе, как если бы они были столами, например
SELECT yr.users_id, yr.Godi, inc.Prihod, exp.Rashod
FROM (
SELECT DISTINCT YEAR(datum) Godi, users_id FROM income
UNION
SELECT DISTINCT YEAR(datum) Godi, users_id FROM expense
) yr
LEFT JOIN (
SELECT sum(insum) as Prihod,
YEAR(datum) as Godi,
users_id
FROM income
GROUP BY YEAR(datum), users_id
) inc ON yr.users_id = inc.users_id AND yr.Godi = inc.Godi
LEFT JOIN (
SELECT sum(amount) as Rashod,
YEAR(datum) as God,
users_id
FROM expense
GROUP BY YEAR(datum), users_id
) exp ON yr.users_id = exp.users_id AND yr.Godi = exp.God
Шаблон запроса здесь состоит в разработке трех подзапросов. Первое из них определяет количество строк в вашем конечном наборе результатов, поскольку оно содержит одну строку для каждой желаемой строки. У второго и третьего запросов есть одна или, может быть, нулевые строки для каждой строки, которая вам нужна в конечном наборе результатов. Тогда вы присоединитесь к ним вместе.