我很新的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”。
我的代码中可能有一堆错误,但这两个是我的主要问题。如果你发现我可以做出的其他错误或改进,我会全神贯注。我会很感激任何帮助!
您正在'INNER JOIN'中使用的子查询是按月分组的SUM',但您并未选择(或分组)“policykey”列。此外,'JOIN'条件试图使用'dbo.ClaimDB'表中的一列,而不是你给予子查询的别名中的一列,这没有任何意义 – Lamak 2014-10-29 14:44:40
Ohhhhhhh这使得很有意义。我明白现在发生了什么(我认为)。我试图使用子查询来自的第三个表列来加入子查询和策略表,而不是直接连接子查询和策略表,对吗? 无论哪种方式,我改变了加盟: 在dbo.PolicyDB.policykey = Loss.policykey 我至少得到了结果,即使他们没有任何意义。谢谢! – blubr 2014-10-29 15:03:26
正确,这就是你应该做的,下面的答案几乎是正确的,但加入条件是错误的,它应该是:'ON dbo.PolicyDB.policykey = Loss.policykey' – Lamak 2014-10-29 15:05:09