Sql 对两个表中不相关的列求和,然后基于ID进行联接

Sql 对两个表中不相关的列求和,然后基于ID进行联接,sql,sql-server-2008-r2,Sql,Sql Server 2008 R2,我有两个表基本上是这样设置的(非常精简的版本): 表1: ID Amt 1 Amt 2 ------------------------- 112 $20 $30 112 $50 $60 125 $75 $05 ID Amt 3 Amt 4 ------------------------- 112 $25 $30 125 $40 $

我有两个表基本上是这样设置的(非常精简的版本):

表1

ID       Amt 1     Amt 2
-------------------------    
112     $20        $30
112     $50        $60
125     $75        $05
ID       Amt 3     Amt 4
-------------------------
112       $25       $30
125       $40       $60
125      $110      $120
表2

ID       Amt 1     Amt 2
-------------------------    
112     $20        $30
112     $50        $60
125     $75        $05
ID       Amt 3     Amt 4
-------------------------
112       $25       $30
125       $40       $60
125      $110      $120
所有金额列需要单独求和,输出类似于:

查询结果:

ID       Amt 1     Amt 2     Amt 3     Amt 4
--------------------------------------------
112     $70        $90       $25       $30
125     $75        $05       $150      $180
我尝试过的连接会导致记录按ID在第二个表中重复的次数的因数进行复制(和求和)。我没有连接这些表的主键

任何帮助都将不胜感激


谢谢

要正确解决此问题,需要分别进行聚合。即使两个表都有多个相同id的行,这也会起作用:

select id, sum(amt1), sum(amt2), sum(amt3), sum(amt4)
from ((select id, sum(amt1) as amt1, sum(amt2) as amt2, NULL as amt3, NULL as amt4
       from tbl1
       group by id
      ) union all
      (select id, NULL, NULL, sum(amt3), sum(amt4)
       from tbl2
       group by id
      )
     ) t
group by id
上面的查询提供了一个
分组依据
的想法。有些人更喜欢使用
完全外部联接
来实现此目的:

select coalesce(t1.id, t2.id) as id, amt1, amt2, amt3, amt4
from (select id, sum(amt1) as amt1, sum(amt2) as amt2
       from tbl1
       group by id
      ) t1 full outer join
      (select id, sum(amt3) as amt3, sum(amt4) as amt4
       from tbl2
       group by id
      ) t2
      on t1.id = t2.id

关键是聚合必须在任何联接之前完成,这样您就不会有多行的问题。

在SQL Server 2005或更新版本上,您可以使用两个CTE(公共表表达式)对每个表进行求和/分组,然后联接这两个表-类似这样:

;WITH CTE1 AS
(
    SELECT 
        ID, Amount1 = SUM(Amt1), Amount2 = SUM(Amt2)
    FROM
        dbo.SumTbl1
    GROUP BY
        ID  
),
CTE2 AS
(
    SELECT 
        ID, Amount3 = SUM(Amt3), Amount4 = SUM(Amt4)
    FROM
        dbo.SumTbl2
    GROUP BY
        ID  
)
SELECT CTE1.ID, Amount1, Amount2, Amount3, Amount4
FROM CTE1
INNER JOIN CTE2 ON CTE1.ID = CTE2.ID

这为我提供了所需的输出

根据ID分别对两个表进行分组,然后加入分组的结果集。欢迎使用StackOverflow:如果您发布代码、XML或数据示例,请在文本编辑器中突出显示这些行,然后单击“代码示例”按钮(
{}
)在编辑器工具栏上很好地格式化和语法突出显示它!这样,您就不需要任何点(
)作为占位符-一个规则的空格也可以!嗨,marc_s,我发现这是最简单的使用方法,而且非常干净。嗨,Gordon Linoff,谢谢你的回复,我最终会使用marc_s,因为我使用的是SQL Server,但如果我切换程序,我会记住这个方法。谢谢