【问题标题】: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
相关资源
最近更新 更多