【问题标题】:Summing unrelated columns in two tables, then joining based on an ID对两个表中不相关的列求和,然后根据 ID 连接
【发布时间】:2012-12-18 04:47:38
【问题描述】:

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

表 1:

ID       Amt 1     Amt 2
-------------------------    
112     $20        $30
112     $50        $60
125     $75        $05

表 2:

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分别对两张表进行分组,然后加入分组后的结果集。
  • 欢迎来到 StackOverflow:如果您发布代码、XML 或数据示例,请在文本编辑器中突出显示这些行并单击“代码示例”按钮 ({ } ) 在编辑器工具栏上很好地格式化和语法高亮它!这样,您就不需要任何点 (.) 作为占位符 - 常规空格也可以!

标签: sql sql-server-2008-r2


【解决方案1】:

在 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

这给了我你想要的输出

【讨论】:

  • 嗨,marc_s,我发现这是最简单的方法,而且非常干净。
【解决方案2】:

要正确解决此问题,您需要单独进行聚合。即使两个表都具有相同 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

上面的查询用group by 给出了这个想法。为此,有些人更喜欢full outer join:

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

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

【讨论】:

  • 嗨,Gordon Linoff,感谢您的回复,我最终会选择 marc_s,因为我使用的是 SQL Server,但如果我切换程序,我会牢记这种方法。谢谢!
猜你喜欢
  • 2015-04-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-28
相关资源
最近更新 更多