【问题标题】:MYSQL sum from two different tables group by来自两个不同表的MYSQL sum by
【发布时间】:2014-11-06 09:36:23
【问题描述】:

我有两张桌子。 我需要将这两个表的每一行组合成 table3 中的一行。我设法得到了 table1 SUM 的金额,但不是 table2。

例如。

表用户

 +---------+-----------+
 | user_id | user_name |
 +---------+-----------+
 | 001     |   JOHN    |
 | 002     |   ADAM    |
 +---------+-----------+

table1

+-----------+----------------+-------------------+---------------------+
| table1_id | table1_user_id |    table1_amount  |       table1_date   |
+-----------+----------------+-------------------+---------------------+
|  6        | 001            |    100            |  01/11/2014 10:55   |  
|  7        | 002            |   100             |  01/11/2014 10:55   | 
|  8        | 001            |    50             |  25/10/2014 10:55   |  
|  9        | 001            |   100             |  23/10/2014 11:00   |  
|  10       | 002            |    0              |  21/10/2014 11:00   | 
+-----------+----------------+-------------------+---------------------+ 

table2

 +-----------+----------------+----------------+--------------------+
 | table2_id | table2_user_id |  table2_amount |  table2_date       |   
 +-----------+----------------+----------------+--------------------+
 |   1       |    001         |   100          |   15/11/2014 10:55 |    
 |   2       |    001         |   100          |   15/10/2014 10:55 |     
 |   3       |    002         |   100          |   11/10/2014 10:55 |     
 |   4       |    001         |   50           |   11/10/2014 10:55 |    
 +-----------+----------------+----------------+--------------------+

预期结果:

表3

+-----+---------+---------------+---------------+----------+---------+
| id  | user_id | table1_amount | table2_amount |    Year  |  Month  |
+-----+---------+---------------+---------------+----------+---------+
| 1   |  001    |    100        |       100     |     2014 |    11   |
| 2   |  002    |    100        |        0      |     2014 |    11   |
| 3   |  001    |    150        |       150     |     2014 |    10   |
| 4   |  002    |     0         |       100     |     2014 |    10   |
+-----+---------+---------------+---------------+----------+---------+

我的尝试,但它没有显示预期的结果。每行table2_amount的数量为NULL

SQL=" INSERT INTO table3 
      SELECT user_id,SUM(table1_amount),t2.amount2,
      YEAR(table1_date),MONTH(table1_date) FROM table1 a 
      LEFT JOIN 
     (SELECT c.table2_user_id,SUM(c.table2_amount) as amount2,c.table2_date
              FROM   table2 c
       GROUP BY DATE_FORMAT(c.table2_date,'%Y-%m'),c.table2_user_id ASC
              ) t2
     on t2.table2_user_id = a.table1_user_id AND t2.table2_date = a.table1_date
     GROUP BY DATE_FORMAT(a.table1_date,'%Y-%m'),table1_user_id ASC ";
"

【问题讨论】:

  • “它不起作用”是什么意思?你有错误吗?你得到不好的结果吗?请详细说明
  • 很抱歉它没有显示预期的结果。 @不知道名字
  • 你为什么使用左连接?表是如何连接的?
  • table1table2 具有相同的属性:user_id ;table1.table1_user_id = table2.table2_user_id =user.@987654336
  • 好吧,检查内部选择。如果没问题,则联接不会返回任何对,并且 LEFT 字会使其仅从 table1 中获取行。我认为比较日期不好,除非你绝对确定它们会相同

标签: mysql


【解决方案1】:

这对UNION来说是一项不错的任务

SELECT tx.uid,SUM(tx.a1),SUM(tx.a2),YEAR(tx.d),MONTH(tx.d)
FROM
(
SELECT t1.table1_user_id as uid,
  t1.table1_amount as a1,
  0 as a2,
  t1.table1_date as d 
  FROM table1 t1
UNION
SELECT t2.table2_user_id as uid,
  0 as a1,
  t2.table2_amount as a2,
  t2.table2_date as d 
  FROM table2 t2
) tx
GROUP BY DATE_FORMAT(d,'%Y-%m'),uid ASC 

【讨论】:

  • 嗨,大卫。谢谢你的回答,但你应该知道 table1_id 和 table2_id 不一样,它们的行数可能不同。我已经应用了你的 SQL 但我收到了这个错误"#1222 - The used SELECT statements have a different number of columns"
  • 这对联合没关系,你确定你完全复制了查询吗?该错误意味着您必须错过这两个子查询选择之一中的一列。
  • 实际上甚至不需要table id,因为它没有被使用,只是用户id。我从我的答案中删除了它。
  • 很抱歉我错过了第二个 UNION SQL 中的 0 as a1。但是,每个 table2_amount 行的结果为 0。仅供参考,table2 的行数:汇总和分组时为 226 行。对于 table1,有 569 行。当我使用你的 SQL 时,它只显示 569 行。它没有合并行。似乎 table1 左连接 table2。
  • 您能告诉我您是如何根据实际需要编辑该查询的吗?您可能在某个地方仍然存在错误。 (请使用pastebin)
【解决方案2】:

感谢 David162795 的启发性讨论。

当两个表中的日期不同时,错过的点是按日期和用户 ID 分组 INNER QUERY。 我们需要在内部查询中按它们各自的日期对它们进行分组,然后按时间变量对主 SELECT 查询进行分组。

这是我对这个案例的回答:

$SQL = "
 INSERT INTO table3 (user_id, table1_amount, table2_amount,Year,  Month)
 SELECT tx.uid, SUM(tx.sum1), SUM(tx.sum2),YEAR(tx.d) as year,MONTH(tx.d) as month 
  FROM 
  (SELECT  b.table1_user_id as uid,b.table1_amount as sum1,0 as sum2,
           b.table1_date as d  FROM   table1 b
    GROUP BY DATE_FORMAT(d,'%Y-%m'),uid ASC

    UNION

    SELECT c.table2_user_id as uid,0 as sum1,
           sum(c.table2_amount) as sum2,c.table2_date   as d1
              FROM   table2 c
    GROUP BY DATE_FORMAT(d1,'%Y-%m'),uid ASC
  ) tx 

 GROUP BY year,month,uid"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-01-15
    • 1970-01-01
    • 2012-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多