内连接和分组

4

我有两个定义相同的表格。

T1:
Name VARCHAR(50)
Qty  INT

T2:
Name VARCHAR(50)
Qty  INT

每个表格都包含以下数据:

T1:
Name   Qty
a   1
b   2
c   3
d   4

T2:
Name   Qty
a   1
b   3
e   5
f   10

我希望得到的结果能够根据名称从两个表中汇总数量。

期望的结果集:

Name    TotalQty
a             2
b             5
c             3
d             4
e             5
f            10

如果我使用左连接或右连接,它都不会返回任何一个表的名称。

我的想法是创建一个临时表并将这些记录添加到其中,并仅对Qty列执行SUM聚合,但我认为应该有更好的方法来实现这一点。

这是我的查询,它没有返回预期的结果集:

SELECT t1.Name, ISNULL(SUM(t1.Qty + t2.Qty),0) TotalQty
FROM t1
LEFT JOIN t2
ON t1.Name = T2.Name
GROUP BY t1.Name

请问在这里创建临时表是否可行,或者还有更好的方法可以实现吗?


t1或t2中是否可以有多条记录属于同一个姓名? - Mark Byers
不需要。该列上有唯一索引。 - Asdfg
2个回答

10

你可以使用全外连接:

SELECT
    ISNULL(t1.Name, t2.Name) AS Name,
    ISNULL(t1.Qty, 0) + ISNULL(t2.Qty, 0) AS TotalQty
FROM t1
FULL JOIN t2 ON t1.Name = T2.Name

在线查看效果:sqlfiddle


如果在t1或t2中有多个记录使用相同的名称,那么它将无法给出正确的结果。我认为我们应该按名称进行分组,而不仅仅是t1.name,应该是coalesce(t1.name,t2.name)。 - Nitin Midha
+1;我喜欢这个,更加简洁。我总是不知道为什么会忘记使用FULL JOIN - LittleBobbyTables - Au Revoir
@NitinMidha:Asdfg已经在评论中指出(https://dev59.com/3GjWa4cB1Zd3GeqPoTI5#lGMFoYgBc1ULPQZFcMCC)如果有唯一索引,t1或t2中的名称不可能存在多条记录。 - Mark Byers

7

您可以使用UNION ALL将两个表作为一个选择,因为它们具有相同的定义。然后,您可以将它们嵌套作为派生表,然后在其上进行SUM操作:

SELECT [Name], SUM(Qty) AS TotalQty
FROM (
    SELECT [Name], Qty
    FROM t1
    UNION ALL
    SELECT [Name], Qty
    FROM t2
) YourDerivedTable
GROUP BY [Name]

@Asdfg - 是的,它应该可以!已编辑 - LittleBobbyTables - Au Revoir

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接