Full Outer Join不返回不匹配的连接字段值SQL SERVER 2005

时间:2011-11-22 17:39:36

标签: sql sql-server-2005 outer-join

我使用下面的代码来计算给定月份的保险(汽车)所赚取的保费,在这种情况下是9月。代码正在做的是将截至9月30日的所有时间总收入减去截至8月31日所有时间的总保费,以便仅返回9月份的保费。

结果看起来像这样:

eprem        coveragecode  
0.0211       AD  
277970.8291  BI  
245700.6741  COLL  
86997.5694   COMP  
85.0083      CustomParts  
848.7873     Death  
0.00         ECL  
0.00         GPIP  
692.3802     Income  
2410.5513    MED  
267670.1099  PD  
387628.504   PIP  
26.8767      PU  
11736.2762   Rental  
4304.3367    Towing   
4211.2574    UIMBI  
19804.8964   UMBI  
15145.3211   UMPD  

当我将所有保险费的保费加起来时,我得到的是1325233.399,这是9月份确保的正确保费金额。

现在我要做的是在结果中添加zipcode字段。如果我运行下面的代码没有在代码中的任何地方指定的zipcode列,那么我得到上面的结果,这是正确的但当我添加zipcode列我返回数千行,这是预期但但当我加起来我总得到的溢价1323608.401而不是1325233.399这是正确的总数。我相信正在发生的事情是有一定的覆盖率和邮政编码组合(这是我加入我的2个派生表)在一个月内(派生表)和另一个注释。当我执行右连接时,我得到不同的行返回数量,当我执行左连接时,但当我将所有溢价加起来时,它总是等于1323608.401而不是1325233.399。我认为我的问题的解决方案是使用完整的外部连接,从而返回所有结果(即使是那些不匹配的),这样我的总保费将加起来1325233.399但是我仍然只得到1323608.401,无论什么类型的连接我尝试使用。有谁知道这里可能会发生什么?任何援助将不胜感激。谢谢!

    SELECT   sept.eprem-aug.eprem as eprem , sept.coveragecode, zipcode 
from

(select 
SUM(EarnedPremium) AS eprem,coveragecode, evaluationdate, zipcode                       
FROM         dbo.StatRateSummary                            
where evaluationdate = '09-30-2011' 
and decpagetypecode != 'x'
GROUP BY evaluationdate ,coveragecode, zipcode

) as sept full outer join 

(select 
SUM(EarnedPremium) AS eprem,coveragecode, evaluationdate, zipcode                       
FROM         dbo.StatRateSummary                            
where evaluationdate = CONVERT(DATETIME, DATEADD(d,-1,DATEADD(mm, DATEDIFF(m,0,'09-30-2011'),0)), 102)  
and decpagetypecode != 'x'
GROUP BY evaluationdate ,coveragecode, zipcode

) as aug on sept.coveragecode = aug.coveragecode and sept.zipcode = aug.zipcode
where sept.coveragecode is not null and sept.coveragecode <> ''
order by coveragecode, sept.evaluationdate

2 个答案:

答案 0 :(得分:1)

我所要做的就是更改第一行代码,将任何null溢价值转换为0。

SELECT   isnull(sept.eprem,0)-isnull(aug.eprem,0) as eprem , sept.coveragecode, zipcode 
from

(select 
SUM(EarnedPremium) AS eprem,coveragecode, evaluationdate, zipcode                       
FROM         dbo.StatRateSummary                            
where evaluationdate = '09-30-2011' 
and decpagetypecode != 'x'
GROUP BY evaluationdate ,coveragecode, zipcode

) as sept full outer join 

(select 
SUM(EarnedPremium) AS eprem,coveragecode, evaluationdate, zipcode                       
FROM         dbo.StatRateSummary                            
where evaluationdate = CONVERT(DATETIME, DATEADD(d,-1,DATEADD(mm, DATEDIFF(m,0,'09-30-2011'),0)), 102)  
and decpagetypecode != 'x'
GROUP BY evaluationdate ,coveragecode, zipcode

) as aug on sept.coveragecode = aug.coveragecode and sept.zipcode = aug.zipcode
where sept.coveragecode is not null and sept.coveragecode <> ''
order by coveragecode, sept.evaluationdate

答案 1 :(得分:0)

您的FULL OUTER JOIN条件应如下所示:

SELECT   sept.eprem-aug.eprem as eprem , sept.coveragecode, zipcode 
from

(select 
SUM(EarnedPremium) AS eprem,coveragecode, evaluationdate, zipcode                       
FROM         dbo.StatRateSummary                            
where evaluationdate = '09-30-2011' 
and decpagetypecode != 'x'
-- Migrated WHERE Condition
AND COALESCE(eprem.coveragecode, '') > ''
GROUP BY evaluationdate ,coveragecode, zipcode

) as sept FULL OUTER join 

(select 
SUM(EarnedPremium) AS eprem,coveragecode, evaluationdate, zipcode                       
FROM         dbo.StatRateSummary                            
where evaluationdate = CONVERT(DATETIME, DATEADD(d,-1,DATEADD(mm, DATEDIFF(m,0,'09-30-2011'),0)), 102)  
and decpagetypecode != 'x'
GROUP BY evaluationdate ,coveragecode, zipcode

) as aug on sept.coveragecode = aug.coveragecode and sept.zipcode = aug.zipcode
/*
|| See SEPT derived table for elimination of NULL and '' coverage codes
|| where sept.coveragecode is not null and sept.coveragecode <> ''
*/
order by coveragecode, sept.evaluationdate

要考虑的一点是,当您使用OUTER JOIN WHERE条件 可能 会导致优化程序将JOIN重写为{{ 1}}而不是。

希望这有帮助。