我有2个表具有相同的userID,category,count模式。我需要一个查询来总结每个用户ID /类别对的计数。有时一对将存在于一个表中而不存在于另一个表中。我在进行连接时遇到问题,而不会丢失仅在1个表中存在userID /类别对的行。这就是我正在尝试的(没有成功):
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”不是实际的列名。我只是为了这个例子而使用它,我忘了它是一个保留字。
答案 0 :(得分:4)
你需要:
另外,由于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
答案 1 :(得分:1)
解决这个问题的一种方法是使用完全外连接:
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()
个(或类似的结构)。
另一种方法是使用聚合的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