сумма по значениям по месяцам из двух таблиц

0

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

У меня две таблицы:

1)costs_1

-id
-total
-updated_at(timestamp)

2)costs_2

-id
-total_1
-updated_at_1(timestamp)

Таблица результатов должна иметь следующие столбцы:

-total
-total_1
-month

Например, если у меня есть одна таблица, я делаю следующий запрос:

SELECT SUM(total), MONTH(updated_at), YEAR(updated_at) FROM product_sale GROUP BY MONTH(updated_at), YEAR(updated_at) ORDER by MONTH(updated_at)
  • 0
    Можете ли вы опубликовать пример данных, как вы хотите данные?
  • 0
    Возможный дубликат: stackoverflow.com/questions/38963679/…
Показать ещё 1 комментарий
Теги:
database

2 ответа

1
Лучший ответ

Я считаю, что тебе нужно что-то подобное.

SELECT t1.y year,
       t1.m month,
       t1.total,
       t2.total
FROM
(
    SELECT YEAR(updated_at) y, 
           MONTH(updated_at) m, 
           SUM(total) total
    FROM costs_1
    GROUP BY YEAR(updated_at), MONTH(updated_at) 
) t1
JOIN
(
    SELECT YEAR(updated_at_1) y, 
           MONTH(updated_at_1) m, 
           SUM(total_1) total
    FROM costs_2
    GROUP BY YEAR(updated_at_1), MONTH(updated_at_1) 
) t2 ON t1.y = t2.y and t1.m = t2.m

Однако в этом решении вы пропустите месяц, если у costs_1 или costs_2 нет записи с месяцем. Если вы хотите ПОЛНЫЙ ПРИСОЕДИНЯЙТЕСЬ, вы должны эмулировать его в mysql, используя два OUTER JOINS, например:

SELECT t1.y year,
       t1.m month,
       COALESCE(t1.total, 0),
       COALESCE(t2.total, 0)
FROM
(
    SELECT YEAR(updated_at) y, 
           MONTH(updated_at) m, 
           SUM(total) total
    FROM costs_1
    GROUP BY YEAR(updated_at), MONTH(updated_at) 
) t1
LEFT JOIN
(
    SELECT YEAR(updated_at_1) y, 
           MONTH(updated_at_1) m, 
           SUM(total_1) total
    FROM costs_2
    GROUP BY YEAR(updated_at_1), MONTH(updated_at_1) 
) t2 ON t1.y = t2.y and t1.m = t2.m

   UNION

SELECT t2.y year,
       t2.m month,
       COALESCE(t1.total, 0),
       COALESCE(t2.total, 0)
FROM
(
    SELECT YEAR(updated_at) y, 
           MONTH(updated_at) m, 
           SUM(total) total
    FROM costs_1
    GROUP BY YEAR(updated_at), MONTH(updated_at) 
) t1
RIGHT JOIN
(
    SELECT YEAR(updated_at_1) y, 
           MONTH(updated_at_1) m, 
           SUM(total_1) total
    FROM costs_2
    GROUP BY YEAR(updated_at_1), MONTH(updated_at_1) 
) t2 ON t1.y = t2.y and t1.m = t2.m
  • 0
    да, работает, спасибо!
  • 0
    Добро пожаловать :)
Показать ещё 2 комментария
0

Попробуй это:

SELECT total, total_1, MONTHNAME(costs_1.updated_at) from costs_1 INNER JOIN costs_2 
ON 
MONTH(costs_1.updated_at)=MONTH(costs_2.updated_at)
  • 0
    В этом решении некоторые ошибки: # 1052 - столбец updated_at в списке полей неоднозначен
  • 1
    @befreeforlife Я обновил ответ, пожалуйста, проверьте.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню