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