SQL 加入某些行中的重复总计
SQL Join Duplicating Totals in Certain Rows
尝试连接两个表以显示匹配的总计,但是连接(或分组依据)为一些记录(不是全部)创建了不正确的总和。我分别检查了两个表以确保支付+税款总额匹配,并且在单独的表中查看时它们也是如此。似乎正在发生的是一些“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
abcd
2020
3520
3520
5678
efgh
2018
4579
9158
9101
ijkl
2019
2378
2378
1121
mnop
2019
9436
9436
如您所见,在第 2 行中,“total1”是“total”值的两倍...“total”和“total1”应该匹配。
任何 help/advice 将不胜感激。
当关系不是一对一时,这是正常的加入行为。您可能在每个 table 中有不止一场比赛。您可以通过多种方式执行此操作。这是一个分别对每个 table 求和然后合并结果的方法。这种关系(cte1 和 cte2 之间)现在是一对一的。我忽略了一个 table 中的条目可能在另一个中没有匹配项的情况。
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 提供的测试用例很有帮助。我对其进行了调整以显示您报告的行为,然后在 fiddle.
的底部添加了一个解决方案
Working test case, edited from the comment of @EdmCoff
请注意,@EdmCoff 创建了一个初始测试用例,它通过在插入之前手动聚合 table 数据来避免该问题。这基本上就是我们在最终解决方案中所做的,在每个 CTE 术语中。
使用 UNION ALL
而不是连接来获取 2 个表的所有行然后聚合:
SELECT pnum, branch, year,
SUM(total) total,
SUM(total1) total1
FROM(
SELECT pnum, branch, year, total, 0 total1 FROM table1
UNION ALL
SELECT pnum2, branch, LEFT(year, 4), 0, paid + tax FROM table2
) t
GROUP BY pnum, branch, year
参见demo。
尝试连接两个表以显示匹配的总计,但是连接(或分组依据)为一些记录(不是全部)创建了不正确的总和。我分别检查了两个表以确保支付+税款总额匹配,并且在单独的表中查看时它们也是如此。似乎正在发生的是一些“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 | abcd | 2020 | 3520 | 3520 |
5678 | efgh | 2018 | 4579 | 9158 |
9101 | ijkl | 2019 | 2378 | 2378 |
1121 | mnop | 2019 | 9436 | 9436 |
如您所见,在第 2 行中,“total1”是“total”值的两倍...“total”和“total1”应该匹配。
任何 help/advice 将不胜感激。
当关系不是一对一时,这是正常的加入行为。您可能在每个 table 中有不止一场比赛。您可以通过多种方式执行此操作。这是一个分别对每个 table 求和然后合并结果的方法。这种关系(cte1 和 cte2 之间)现在是一对一的。我忽略了一个 table 中的条目可能在另一个中没有匹配项的情况。
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 提供的测试用例很有帮助。我对其进行了调整以显示您报告的行为,然后在 fiddle.
的底部添加了一个解决方案Working test case, edited from the comment of @EdmCoff
请注意,@EdmCoff 创建了一个初始测试用例,它通过在插入之前手动聚合 table 数据来避免该问题。这基本上就是我们在最终解决方案中所做的,在每个 CTE 术语中。
使用 UNION ALL
而不是连接来获取 2 个表的所有行然后聚合:
SELECT pnum, branch, year,
SUM(total) total,
SUM(total1) total1
FROM(
SELECT pnum, branch, year, total, 0 total1 FROM table1
UNION ALL
SELECT pnum2, branch, LEFT(year, 4), 0, paid + tax FROM table2
) t
GROUP BY pnum, branch, year
参见demo。