2

我有 2 个具有相同用户 ID、类别、计数模式的表。我需要一个查询来计算每个用户 ID/类别对的计数。有时一对将存在于一个表中而不是另一个表中。我无法在不丢失用户 ID/类别对仅存在于 1 个表中的行的情况下进行连接。这就是我正在尝试的(没有成功):

select a.user, a.category, count=a.count+b.count
from #temp1 a join #temp2 b
on a.user = b.user and a.category = b.category

例子:

输入:

user    category    count
id1     catB        3
id2     catG        9
id3     catW        17

user    category    count
id1     catB        1
id2     catM        5
id3     catW        13

期望的输出:

user    category    count
id1     catB        4
id2     catG        9
id2     catM        5
id3     catW        30

更新:“count”不是实际的列名。我只是为了这个例子而使用它,我忘记了它是一个保留字。

4

2 回答 2

4

你需要:

  1. 使用完全外连接,这样您就不会删除一个表中存在的行而不是另一个表中的行
  2. 在添加之前合并计数,因为 0 + NULL = NULL

另外,因为COUNT是保留字,我建议转义它。

因此,使用所有这些准则,您的查询将变为:

SELECT COALESCE(a.user, b.user) AS user, 
       COALESCE(a.category, b.category) AS category, 
       COALESCE(a.[count],0) + COALESCE(b.[count],0) AS [count]
FROM #temp1 AS a 
FULL OUTER JOIN #temp2 AS b
             ON a.user = b.user AND 
                a.category = b.category
于 2013-07-10T18:58:41.370 回答
3

解决此问题的一种方法是使用完全外连接:

select coalesce(a.user, b.user) as user,
       coalesce(a.category, b.category) as category,
       coalesce(a.count, 0) + coalesce(b.count, 0) as "count"
from #temp1 a full outer join
     #temp2 b
     on a.user = b.user and
         a.category = b.category;

使用时full outer join,您必须小心,因为关键字段可能是NULL仅在一个表中匹配时。结果,select往往有很多coalesce()s (或类似的结构)。

另一种方法是使用union all聚合查询:

select "user", category, SUM(count) as "count"
from ((select "user", category, "count"
       from #temp1
      ) union all
      (select "user", category, "count"
       from #temp2
      )
     ) t
group by "user", category
于 2013-07-10T18:59:07.863 回答