2014-10-29 25 views
0

我很新的SQL,我试图加入两个表使用一个表中的主要(和独特)列,但不是主要(并可能有多个行)在另一个表中。代码如下。如何将两个表连接到一个主要的一个而不是另一个的公共列中?

SELECT LEFT(CAST(dbo.PolicyDB.accountingmonth AS VARCHAR(4)),4) AS AccountingYear, 
    SUM(dbo.PolicyDB.EarnedPremium) AS EarnedPremium, 
    SUM(Loss.TotalPaidLoss) as TotalPaidLoss 
FROM dbo.PolicyDB 
INNER JOIN (
     SELECT SUM(dbo.ClaimDB.losspaid + dbo.ClaimDB.expensepaid - dbo.ClaimDB.recovery) as TotalPaidLoss 
     FROM dbo.ClaimDB 
     GROUP BY accountingmonth 
     ) Loss 
ON dbo.PolicyDB.policykey = dbo.ClaimDB.policykey 
GROUP BY LEFT(CAST(dbo.PolicyDB.accountingmonth AS VARCHAR(4)),4) 

基本上,我想创建一个表,将显示三列:会计年度,已赚保费(当年),并支付总损失(当年)。

我有几个问题。首先,我不知道我是否正确调用了Loss.TotalPaidLoss。当我的数据库与另一个数据库不同时,我不知道有多种方法将多个字段合并成一个字段。其次,加入两个策略密钥的列是策略数据库中的主要(而唯一)密钥,但不在索赔数据库中(多个索赔可能来自一个策略)。当我运行此代码时,出现此错误消息:

Msg 4104,Level 16,State 1,Line 11 无法绑定多部分标识符“dbo.ClaimDB.policykey”。

我的代码中可能有一堆错误,但这两个是我的主要问题。如果你发现我可以做出的其他错误或改进,我会全神贯注。我会很感激任何帮助!

+1

您正在'INNER JOIN'中使用的子查询是按月分组的SUM',但您并未选择(或分组)“policykey”列。此外,'JOIN'条件试图使用'dbo.ClaimDB'表中的一列,而不是你给予子查询的别名中的一列,这没有任何意义 – Lamak 2014-10-29 14:44:40

+0

Ohhhhhhh这使得很有意义。我明白现在发生了什么(我认为)。我试图使用子查询来自的第三个表列来加入子查询和策略表,而不是直接连接子查询和策略表,对吗? 无论哪种方式,我改变了加盟: 在dbo.PolicyDB.policykey = Loss.policykey 我至少得到了结果,即使他们没有任何意义。谢谢! – blubr 2014-10-29 15:03:26

+1

正确,这就是你应该做的,下面的答案几乎是正确的,但加入条件是错误的,它应该是:'ON dbo.PolicyDB.policykey = Loss.policykey' – Lamak 2014-10-29 15:05:09

回答

1

您的第二张表LossJOIN实际上是一个派生(别名)表。您应该使用dbo.PolicyDB.policykey = Loss.policykey。但是这张表现在没有PolicyKey列。它需要:

SELECT LEFT(CAST(dbo.PolicyDB.accountingmonth AS VARCHAR(4)),4) AS AccountingYear, 
    SUM(dbo.PolicyDB.EarnedPremium) AS EarnedPremium, 
    SUM(Loss.TotalPaidLoss) as TotalPaidLoss 
FROM dbo.PolicyDB 
INNER JOIN (
     SELECT SUM(losspaid + expensepaid - recovery) as TotalPaidLoss, PolicyKey 
     FROM dbo.ClaimDB 
     GROUP BY PolicyKey 
     ) Loss 
ON dbo.PolicyDB.policykey = Loss.policykey 
GROUP BY LEFT(CAST(dbo.PolicyDB.accountingmonth AS VARCHAR(4)),4) 

你也不要占每月需要汇总(集团)ClaimDB列,我觉得。

+0

正如你所说的,连接条件应该是'dbo.PolicyDB.policykey = Loss.policykey',但是你的代码中使用了错误的代码 – Lamak 2014-10-29 15:05:45

+0

正如lamak和你所说的,问题在于我试图编辑你的帖子,以反映你的意见,因为你描述了为什么它是错的,但忘了更改你的代码。 – blubr 2014-10-29 15:09:15

+0

正确,谢谢。 – SouravA 2014-10-29 15:11:33

相关问题