sql - SQL 联接在某些行中重复总计
问题描述
尝试连接两个表以显示匹配的总数,但是连接(或分组依据)正在为一些记录(不是全部)创建不正确的总和。我分别检查了这两个表,以确保支付+税的总数匹配,并且在单独的表中查看时它们会这样做。似乎正在发生的是一些“total1”记录被乘以 2(不知道为什么)。
表格1:
pnum | 分支 | 年 | 全部的 |
---|---|---|---|
5678 | efgh | 2018 | 2000 |
5678 | efgh | 2018 | 2579 |
表2:
pnum | 分支 | 年 | 有薪酬的 | 税 |
---|---|---|---|---|
5678 | efgh | 2018 | 3200 | 900 |
5678 | efgh | 2018 | 400 | 79 |
代码:
Select pnum, a.branch, a.year, sum(total) as total, sum(paid+tax) as total1
from ##table1 a
inner join ##table2 b
on a.[pnum] = b.pnum2 and a.year = left(b.year,4) and a.branch = b.branch
Group by pnum, a.branch, a.year
结果如下所示:
pnum | 分支 | 年 | 全部的 | 总计1 |
---|---|---|---|---|
1234 | A B C D | 2020 | 3520 | 3520 |
5678 | efgh | 2018 | 4579 | 9158 |
9101 | 伊克尔 | 2019 | 2378 | 2378 |
1121 | 操作 | 2019 | 9436 | 9436 |
如您所见,在第 2 行中,“total1”是“total”值的两倍……“total”和“total1”都应该匹配。
任何帮助/建议将不胜感激。
解决方案
当关系不是一对一时,这是正常的连接行为。每个表中可能有多个匹配项。您可以通过多种方式做到这一点。这是一个分别对每个表求和然后加入结果的方法。这种关系(在 cte1 和 cte2 之间)现在是一对一的。我忽略了一个表中的条目可能在另一个表中不匹配的情况。
WITH cte1 AS (
SELECT pnum, branch, year, SUM(total) AS total1
FROM table1
GROUP BY pnum, branch, year
)
, cte2 AS (
SELECT pnum2 AS pnum, branch, year, SUM(paid+tax) AS total2
FROM table2
GROUP BY pnum2, branch, year
)
SELECT cte1.pnum, cte1.branch, cte1.year, cte1.total1, cte2.total2
FROM cte1
JOIN cte2
ON cte1.pnum = cte2.pnum
AND cte1.branch = cte2.branch
AND cte1.year = cte2.year
;
最终修正结果:
pnum branch year total1 total2
5678 efgh 2018 4579 4579
@EdmCoff 提供的测试用例很有帮助。我对其进行了调整以显示您报告的行为,然后在小提琴底部添加了一个解决方案。
请注意,@EdmCoff 创建了一个初始测试用例,通过在插入之前手动聚合表数据来避免该问题。这基本上就是我们在最终解决方案中所做的,在每个 CTE 术语中。
推荐阅读
- tensorflow2.0 - 如何安装低版本 TensorFlow Model Gardon?
- julia - 有没有办法将依赖字段传递给 Julia 结构?
- amazon-web-services - 用于启动/停止 Aurora 集群的 AWS Lambda 函数
- swift - SwiftUI - 添加新行时,macOS 上列表中的文本编辑器闪烁
- python - 如何在机器学习中使用不同的数据集测试我的训练模型
- sql-server - Terraform InvalidParameterCombination 与 AWS Microsoft SQL
- python - 在python中调用它后如何返回n次API响应?
- python - Python、django:我编写了一些代码,但我认为执行起来需要时间。蟒蛇慢吗?还是我的代码慢?
- c++ - 即使我将其留空,C++ 也会初始化变量的值,为什么会发生这种情况?
- javascript - 为什么 Chromium 会抛出“未找到指定的本机消息传递主机”。错误?