Sql 对两个表中不相关的列求和,然后基于ID进行联接
我有两个表基本上是这样设置的(非常精简的版本): 表1: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 $
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,但如果我切换程序,我会记住这个方法。谢谢