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 或其他什么???我认为不应该这么复杂。
有什么想法或建议吗?
您应该对两个保单编号都设置为 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)