Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 如何使用一个公共列连接两个表,该公共列在一个表中是主列,而在另一个表中不是主列?_Sql Server_Database - Fatal编程技术网

Sql server 如何使用一个公共列连接两个表,该公共列在一个表中是主列,而在另一个表中不是主列?

Sql server 如何使用一个公共列连接两个表,该公共列在一个表中是主列,而在另一个表中不是主列?,sql-server,database,Sql Server,Database,我对SQL非常陌生,我正在尝试使用一个列连接两个表,该列在一个表中是主列(且不同),但在另一个表中不是主列(且可能有多行)。代码如下 SELECT LEFT(CAST(dbo.PolicyDB.accountingmonth AS VARCHAR(4)),4) AS AccountingYear, SUM(dbo.PolicyDB.EarnedPremium) AS EarnedPremium, SUM(Loss.TotalPaidLoss) as TotalPaidLoss F

我对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。当多个字段的数据库不同于另一个字段时,我不知道还有什么其他方法可以将多个字段相加到一个字段中

其次,连接这两个元素的列Policy Key是Policy DB中的主(且唯一)键,但不在Claims DB中(b/c多个声明可以来自一个策略)。运行此代码时,会收到以下错误消息:

Msg 4104,16级,状态1,第11行 无法绑定多部分标识符“dbo.ClaimDB.policykey”


我的代码中可能有很多错误,但这两个是我的主要问题。如果你发现我能做的其他错误或改进,我洗耳恭听。我将感谢任何帮助

JOIN中的第二个表
Loss
实际上是一个派生(别名)表。您应该使用
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
列。

您在
内部联接中使用的子查询是一个
总和
按月分组,但您没有选择(或分组)
policykey
列。此外,
JOIN
条件试图使用
dbo.ClaimDB
表中的一列,而不是您提供给子查询的别名中的一列,这没有任何意义。我知道现在发生了什么(我想)。我试图使用子查询来自的第三个表列连接子查询和策略表,而不是直接连接子查询和策略表,对吗?无论哪种方式,我都将连接更改为:On dbo.PolicyDB.policykey=Loss.policykey,并且我至少得到了结果,尽管它们没有意义。谢谢正确,这就是你应该做的,下面的答案几乎正确,但是连接条件是错误的,应该是:
ON dbo.PolicyDB.policykey=Loss.policykey
@lamak,是的。那是个打字错误。多么丢脸啊:-(正如你所说,加入条件应该是dbo.PolicyDB.policykey=Loss.policykey
,但是你在代码上使用了错误的一个,正如拉马克和你所说的,问题在于加入的事情。我试图编辑你的帖子以反映你所说的,因为你描述了错误的原因,但忘记了更改你所发布的代码。