【问题标题】:SQL - How can I JOIN two tables and SUM a column based on IDs between them?SQL - 如何加入两个表并根据它们之间的 ID 对列求和?
【发布时间】:2018-04-30 03:32:18
【问题描述】:

我有两张桌子。一张表是主数据

表 tbl1:

+-------------+------------+------------+
| ID          | Name       | Total      | 
+-------------+------------+------------+
| 1           | a          | 10         |
| 2           | b          | 5          |
| 3           | c          | 4          |
| 4           | a          | 4          |
+-------------+------------+------------+

第二个表tbl2 包含子数据。表之间的键是ID

表 tbl2:

+-------------+------------+
|id           | qty        | 
+-------------+------------+
| 1           | 4          |              
| 1           | 3          |                
| 1           | 1          |                
| 3           | 1          |                
| 3           | 3          |                
+-------------+------------+

我需要得到这样的输出:

输出:

+-------------+------------+------------+
| name        | sum_tot    | sum_qty    | 
+-------------+------------+------------+
| a           | 14         | 8          |
| b           | 5          | 0          |
| c           | 4          | 4          |
+-------------+------------+------------+

我试过这个:

select tbl1.name, SUM(tbl1.total), SUM(tbl2.qty)
from tbl1
left join tbl2 ON tbl1.id = tbl2.id
GROUP by tbl1.name

我得到的输出是:

输出:

+-------------+------------+------------+
| name        | sum_tot    | sum_qty    | 
+-------------+------------+------------+
| a           | 34         | 8          |
| b           | 5          |null        |
| c           | 8          | 4          |
+-------------+------------+------------+

这是不正确的。

这里是sql fiddle

第一个表的摘要与第二个表无关。似乎以某种方式查询运行了 3 次。

【问题讨论】:

  • 解释a变成14的逻辑?
  • a在表1中出现两次,一次为10,一次为4

标签: mysql sql join sum


【解决方案1】:

您可以简单地拥有一个计算 tbl2 总和的相关子查询:

select tbl1.name, 
       SUM(tbl1.total), 
       SUM(COALESCE((select SUM(tbl2.qty) 
                     from tbl2
                     where tbl1.id = tbl2.id), 0)) as qty_tot
from tbl1
GROUP by tbl1.name

【讨论】:

  • 嗯...这很好,但有一个问题。看到这个:link。对于名称,总 sum_tot 为 19,这是正确的,但 sum_qty 应为 21 而不是 8。Id 1、4 和 8 在 tbl2 中,它们与名称 a 相关。
  • 稍后再回来查看!完成。
【解决方案2】:
SELECT A.name, SUM(A.total) as sum_tot, COALESCE(B.sum_qty, 0) as sum_qty
FROM tbl1 A
LEFT JOIN (
    SELECT id, SUM(qty) as sum_qty
    FROM tbl2
    GROUP BY id
) B ON B.id = A.id
GROUP BY A.name

【讨论】:

    【解决方案3】:
    select tbl1.name, SUM(tbl1.total), SUM(COALESCE(tbl2.qty, 0))
    from tbl1
    left join tbl2 ON tbl1.id = tbl2.id
    GROUP by tbl1.name
    

    【讨论】:

    • 不幸的是,这给出了与我相同的结果。应该有 for name sum of total = 14 但 tbl2 中与 id 1 相关的子项的总和是 8。
    • 这会将 NULL 替换为 0。这是问题解决方案的一半。但它仍然显示表 1 中值 C 的 8,而不是 4。
    猜你喜欢
    • 1970-01-01
    • 2018-03-22
    • 2016-04-09
    • 1970-01-01
    • 2019-07-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-24
    • 1970-01-01
    相关资源
    最近更新 更多