【问题标题】:SQL Query to SUM values from column using the same ID from another tableSQL查询使用另一个表中的相同ID从列中求和值
【发布时间】:2021-02-08 01:13:19
【问题描述】:

我有两个如下表;

table1
===========================
| table1_ID | table1_name |
===========================
|     1     |      A      |
|     2     |      B      |
===========================

table2
======================================
| table2_ID | table2_qty | table2_ID |
======================================
|     22    |      4     |     A     |
|     23    |      9     |     A     |
|     24    |     12     |     B     |
|     25    |     23     |     B     |
======================================

输出应该是这样的:

================================
| table1_ID | name | total_qty |
================================
|     1     |   A  |     13    |
|     2     |   B  |     35    |
================================

"table2 ID , name & 'table2_qty' 与 'table1_ID' 相同 ID 的总和值"

我试过了,但结果不是我想要的。

SELECT table1.table1_ID, table1.table1_name,            
SUM(table2.table2_qty) As total_qty 
FROM table1, table2 
GROUP BY table1.table1_ID, table1.table1_name;

如何在 SQL 中获得该结果?
谢谢!

【问题讨论】:

  • 提示:JOINGROUP BY。你试过什么?

标签: sql ms-access sum inner-join aggregate-functions


【解决方案1】:

这是一个使用相关子查询的选项:

select t1.*,
    (
        select sum(t2.table2_qty)
        from table2 as t2
        where t2.table2_id = t1.table1_name
    ) as total_qty
from table1 as t1

你也可以join和聚合:

select t1.table1_id, t1.table1_name, sum(t2.table2_qty) as total_qty
from table1 t1
left join table2 t2 on t2.table2_id = t1.table1_name
group by t1.table1_id, t1.table1_name

【讨论】:

    【解决方案2】:

    您可以使用嵌套查询:

    select t1.table1_id, t2.name, t2.total_qty
    from table1 t1
    join (
        select table2_id name, sum(table2_qty) total_qty
        from table2
        group by table2_id
    ) t2 on t2.name = t1.table1_name;
    

    【讨论】:

      【解决方案3】:

      本质上,由于您在 FROM 子句中使用逗号分隔表,因此您的尝试是在交叉连接查询上进行聚合。

      FROM table1, table2
      

      MS Access 使用这种较旧的 SQL 语法,因为它的方言还不支持显式 CROSS JOIN 以清楚地显示您正在尝试的内容。我有 suggested 这样的支持以及其他功能。

      因此,您的聚合在两个表的 cartesian product 上运行,它们成对匹配两个表中的 每个 行组合。很可能您的分组和总数比预期的要大得多。

      要修复,只需将CROSS JOIN 转为INNER JOIN

      SELECT t1.table1_ID
           , t1.table1_name
           , SUM(t2.table2_qty) AS total_qty 
      FROM table1 t1
      INNER JOIN table2 t2
        ON t1.table1_ID = t2.table1_ID
      GROUP BY t1.table1_ID
             , t1.table1_name;
      

      【讨论】:

        猜你喜欢
        • 2020-11-15
        • 2017-04-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-19
        • 1970-01-01
        • 2013-09-25
        相关资源
        最近更新 更多