为什么这个完全外部联接不起作用?

Jua*_*lez 10 sql-server-2008 join sql-server

我之前使用过完全外部联接来获得我想要的结果,但也许我不完全理解这个概念,因为我无法完成应该是简单的联接。

我有 2 个表(我称之为 t1 和 t2),每个表有 2 个字段:

t1

Policy_Number Premium
101             15
102              7
103             10
108             25
111              3
Run Code Online (Sandbox Code Playgroud)

t2

Policy_Number   Loss
101              5
103              9
107              20
Run Code Online (Sandbox Code Playgroud)

我想要做的是从两个表以及 Policy_Number 中获取 Premium 和 Sum of Losses 的总和。我正在使用的代码是:

select sum(premium) Prem_Sum, sum(Loss) Loss_Sum, t1.policynumber
from t1 full outer join t2 on t1.policynumber = t2.policynumber
group by t1.policynumber
Run Code Online (Sandbox Code Playgroud)

上面的代码将返回正确的总和,但它会将在“NULL”policy_number 下没有 policy_number 匹配的所有记录分组。

我希望我的结果看起来像这样

Policy_Number    Prem_Sum    Loss_Sum
    107            NULL        20
    111              3        NULL
    101             15          5
Run Code Online (Sandbox Code Playgroud)

等等.....

我不想要显示 NULL policy_number 的结果,如下所示(因为没有 NULL policy_number 这样的东西。这只是两个表中的 policy_number 不匹配时的总数):

Policy_Number    Prem_Sum   Loss_Sum
   NULL            35         NULL
Run Code Online (Sandbox Code Playgroud)

如果我按 t2.policy_number 而不是 t1.policy_number 选择和分组,那么我会得到类似下面的记录。

Policy_Number    Prem_Sum   Loss_Sum
   NULL            NULL         20
Run Code Online (Sandbox Code Playgroud)

同样,我不介意在 Prem_Sum 或 Loss_sum 下看到 NULL,但我不想在 Policy_Number 下看到 NULL。我希望我的结果是这样的

Policy_Number    Prem_Sum    Loss_Sum
    107            NULL        20
    111              3        NULL
    101             15          5
Run Code Online (Sandbox Code Playgroud)

等等……

我认为完整的外连接可以实现这一点,但我想我错过了一些东西。我在想也许我可以选择和分组 t1.policy_number 和 t2.policy_number 作为子查询,然后可能在外部查询中做一个 CASE 或其他什么???我认为不应该这么复杂。

有什么想法或建议吗?

Der*_*omm 8

您应该对两个保单编号都设置为 isnull,以便您可以正确分组。

由于它是外连接,因此连接的一侧可能为 NULL,同时仍有数据。

select sum(premium) Prem_Sum, sum(Loss) Loss_Sum, isnull(t1.policynumber, t2.policynumber)
from t1 full outer join t2 on t1.policynumber = t2.policynumber
group by isnull(t1.policynumber, t2.policynumber)
Run Code Online (Sandbox Code Playgroud)