如何在MS Access SQL中连接表并对连接列求和
需求说明
我有三张表,结构和数据如下:
Table1(ID唯一)
| ID | weight |
|---|---|
| 10501058730 | 12 |
| 10502060832 | 16 |
| 10504063941 | 45 |
| 10507066038 | 28 |
Table2
| ID | expense_1 |
|---|---|
| 10501058730 | 9752 |
| 10501058730 | 457 |
| 10504063941 | 238 |
| 10507066038 | 9570 |
Table3
| ID | expense_2 |
|---|---|
| 10501058730 | 342 |
| 10502060832 | 745 |
| 10504063941 | 8768 |
| 10502060832 | 672 |
需要获取Table1的所有行,同时对每个ID对应的expense_1和expense_2求和,无对应数据时显示0,期望结果如下:
| ID | weight | expense_1 | expense_2 |
|---|---|---|---|
| 10501058730 | 12 | 10209 | 342 |
| 10502060832 | 16 | 0 | 1417 |
| 10504063941 | 45 | 238 | 8768 |
| 10507066038 | 28 | 9570 | 0 |
尝试常规查询后结果错误,求解决办法。
解决方案
直接关联Table2和Table3会出现笛卡尔积问题(比如某ID在两张表都有多行时,结果会重复计算),正确做法是先分别对Table2、Table3按ID求和,再与Table1做左关联,最后用COALESCE将NULL替换为0。
SQL查询语句
SELECT t1.ID, t1.weight, COALESCE(t2.total_expense1, 0) AS expense_1, COALESCE(t3.total_expense2, 0) AS expense_2 FROM Table1 t1 LEFT JOIN ( SELECT ID, SUM(expense_1) AS total_expense1 FROM Table2 GROUP BY ID ) t2 ON t1.ID = t2.ID LEFT JOIN ( SELECT ID, SUM(expense_2) AS total_expense2 FROM Table3 GROUP BY ID ) t3 ON t1.ID = t3.ID ORDER BY t1.ID;
关键说明
- 子查询聚合:先对Table2、Table3按ID分组求和,避免直接关联时的笛卡尔积导致求和结果错误。
- 左关联保留全量数据:使用
LEFT JOIN确保Table1的所有行都被保留,不受Table2/Table3数据存在性影响。 - NULL值替换:
COALESCE函数将无对应数据时的NULL值替换为0,匹配期望结果格式。
内容的提问来源于stack exchange,提问作者ecopy
相关产品推荐
相关产品推荐

