Используйте объединение для трех таблиц

0

У меня три таблицы, и я хотел бы суммировать значения по месяцам из трех таблиц.

Структура базы данных:

1)costs_1

-id
-total
-updated_at(timestamp)

2)costs_2

-id
-total_1
-updated_at_1(timestamp)

3)costs_3
    -id
    -total_2
    -updated_at_2(timestamp)

Структура таблицы результатов: 1) всего; 2) TOTAL_1; 3) TOTAL_2; 4 месяца

У меня есть код, который работает для двух таблиц, но не знаю, как его адаптировать

        SELECT t1.y year,
           t1.m month,
           COALESCE(t1.total, 0),
           COALESCE(t2.total, 0)
               
        FROM
        (
            SELECT YEAR(date_month) y, 
                   MONTH(date_month) m, 
                   SUM(total) total
            FROM market_costs
            GROUP BY YEAR(date_month), MONTH(date_month) 
        ) t1
        LEFT JOIN
        (
            SELECT YEAR(date_month) y, 
                   MONTH(date_month) m, 
                   SUM(total) total
            FROM general_costs
            GROUP BY YEAR(date_month), MONTH(date_month) 
        ) 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(date_month) y, 
                   MONTH(date_month) m, 
                   SUM(total) total
            FROM market_costs
            GROUP BY YEAR(date_month), MONTH(date_month) 
        ) t1
        RIGHT JOIN
        (
            SELECT YEAR(date_month) y, 
                   MONTH(date_month) m, 
                   SUM(total) total
            FROM general_costs
            GROUP BY YEAR(date_month), MONTH(date_month) 
        ) t2 ON t1.y = t2.y and t1.m = t2.m
Теги:
database

1 ответ

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

Объедините 3 таблицы, используя UNION ALL затем сгруппируйте данные:

SELECT
      YEAR(t1.date_month) y
    , MONTH(t1.date_month) m
    , SUM(t1.total) total
    , SUM(t1.total_1) total_1
    , SUM(t1.total_2) total_2
FROM (
      SELECT
            date_month
          , total
          , NULL as total_1
          , NULL as total_2
      FROM costs
      UNION ALL
      SELECT
            date_month
          , NULL as total
          , total_1
          , NULL as total_2
      FROM costs_1
      UNION ALL
      SELECT
            date_month
          , NULL as total
          , NULL as total_1
          , total_2
      FROM costs_2
      ) t1
GROUP BY
      YEAR(t1.date_month)
    , MONTH(t1.date_month)

добавленной

SELECT
      YEAR(t1.date_month) y
    , MONTH(t1.date_month) m
    , SUM(t1.total) total
    , SUM(t1.total_1) total_1
    , SUM(t1.total_2) total_2
FROM (
      SELECT
            date_month
          , total
          , NULL as total_1
          , NULL as total_2
      FROM costs
      UNION ALL
      SELECT
            date_month
          , NULL as total
          , total as total_1 -- changed
          , NULL as total_2
      FROM costs_1
      UNION ALL
      SELECT
            date_month
          , NULL as total
          , NULL as total_1
          , total as total_2  -- changed
      FROM costs_2
      ) t1
GROUP BY
      YEAR(t1.date_month)
    , MONTH(t1.date_month)
  • 0
    Это работа, спасибо! Но как его использовать, если поле total одинаково в трех таблицах, таких как 'total', 'total', 'total'?) Я получаю ошибку.
  • 1
    просто, смотрите добавленное в ответе
Показать ещё 2 комментария

Ещё вопросы

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