我使用下面的代码来计算给定月份的保险(汽车)所赚取的保费,在这种情况下是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
答案 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}}而不是。
希望这有帮助。