使用连接三个表

时间:2018-01-16 02:44:59

标签: mysql sql database

我有三张桌子,我希望按月从三张桌子中加总值。

数据库的结构:

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




1 个答案:

答案 0 :(得分:2)

使用UNION ALL合并3个表,然后对数据进行分组:

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)