代码之家  ›  专栏  ›  技术社区  ›  DarkLeafyGreen

两个具有相同架构的bigjoin表

  •  0
  • DarkLeafyGreen  · 技术社区  · 6 年前

    +---------+--------+----------------------+
    |  value  |  city  |   timestamp          |
    +---------+--------+----------------------+
    | 50      |  LA    |  2019-02-6 03:05pm   |
    | 163     |  NYC   |  2019-02-5 03:06pm   |
    | 681     |  SF    |  2019-02-4 06:41pm   |
    | 35      |  LA    |  2019-02-3 05:12pm   |
    +---------+--------+----------------------+
    

    第一张表是定期付款,第二张是收费表。我想加入表格并按如下方式分组:

    +------------+--------+----------+--------------+
    |  regular   |  fees  |   city   |  timestamp   |
    +------------+--------+----------+--------------+
    | 50         | 20     | LA       |  2019-02-6   |
    | 163        | NULL   | NYC      |  2019-02-5   |
    | 681        | ..     | SF       |  2019-02-4   |
    | 35         | ..     | LA       |  2019-02-3   |
    +------------+--------+----------+--------------+
    

    SELECT t1.city, regular, fees, t1.day
    FROM
    (
      SELECT city, SUM(value) AS regular, FORMAT_TIMESTAMP("%Y-%m-%d", TIMESTAMP(timestamp)) as day
      FROM `payments`
      GROUP BY day, city
    ) t1
    FULL JOIN (
      SELECT city, SUM(value) AS fees, FORMAT_TIMESTAMP("%Y-%m-%d", TIMESTAMP(timestamp)) as day
      FROM `fees`
      GROUP BY day, city
    ) t2
    ON t1.day = t2.day
    ORDER BY t1.day DESC
    

    这会生成正确的输出模式,但不会正确地合计费用:

    +------------+--------+----------+--------------+
    |  regular   |  fees  |   city   |  timestamp   |
    +------------+--------+----------+--------------+
    | 26500      | 6300   | LA       |  2019-02-6   |
    | 26500      | 8500   | LA       |  2019-02-6   |
    | 26500      | 1000   | LA       |  2019-02-6   |
    +------------+--------+----------+--------------+
    

    正如你所看到的,我得到的是同一天和城市不同的费用价值。你知道我做错什么了吗?

    0 回复  |  直到 6 年前
        1
  •  2
  •   Mikhail Berlyant    6 年前

    问题就在你的ON子句中——你只在days加入,但是应该在days和city加入,如下面的片段所示

    ON t1.day = t2.day
    AND t1.city = t2.city