希望我能在这里有意义。
我正在处理索赔数据,索赔人可以是他们自己政策的成员,依赖别人的政策,或两者兼而有之。
当索赔人提出索赔时,索赔附在保单编号上。
我试图为每个索赔人获得一行但是当我尝试加入以获取此政策号时,我得到多行。
我需要保单编号,但每个索赔人也需要一行。
关于如何最好地解决这个问题的任何想法?
这是我需要完成的事情。
TABLE1
=========================================================
Claim No. Policy No. Claimant Identity
=========================================================
1 2 Joe Member
2 3 Joe Spouse
3 3 Suzy Member
4 1 Mark Spouse
=========================================================
TABLE2
=========================================================
Policy No. Member E-mail
=========================================================
1 Diane merp@merp
2 Joe potato@potato
3 Suzy fake@fake
=========================================================
RESULT
=================================================================================
Policy No. Claimant Identity E-mail No. of Claims
=================================================================================
2 Joe Member potato@potato 2
3 Suzy Member fake@fake 1
1 Mark Spouse merp@merp 1
=================================================================================
基本上,我想抓住每个索赔人的电子邮件和索赔总数。如果他们是计划的成员,请抓住该政策编号,然后获取提交索赔的政策编号。
我不知道我是否有足够的信息来解决这个问题。我能想到的唯一方法是使用名称字段,但这并不是唯一的(例如,在此数据中可能有许多John Smiths。)
答案 0 :(得分:1)
您可以使用公用表表达式汇总TABLE1
中的数据,然后再加入其中。 (在这里,我冒昧地将TABLE1
重命名为Claims
,将TABLE2
重命名为Policies
:
;WITH ClaimsSummary AS (
SELECT
COUNT(*) AS ClaimCount,
PolicyNo
FROM Claims
GROUP BY PolicyNo
)
SELECT
*
FROM Policies AS p
INNER JOIN ClaimsSummary AS cs
ON p.PolicyNo = cs.PolicyNo
我使用您的数据制作了一个SQLFiddle,因此您可以直观地看到它:http://sqlfiddle.com/#!6/2af67/1
一些解释:
JOIN
子句内。公用表格表达式始终以WITH
开头,并且必须以;
开头,除非它们是查询批处理中的第一个语句。 (我添加了;
的习惯;这不是必需的。)COUNT(*)
被称为"聚合函数"。聚合函数将多行的值组合在一起以形成单个值。GROUP BY
告诉我们的聚合函数要聚合的列。我们想要的是,#34;所有索赔的数量,特定政策编号" - 所以我们调用COUNT(*)
来计算表中的行数(因为一行=一个声明),并按策略编号分组 - 这为我们ClaimsSummary
CTE中的每一行{{{ 1}},以及每个唯一PolicyNo
PolicyNo
中为每个人ClaimsSummary
创建了一条记录 - 然后我们所要做的就是将PolicyNo
两个表放在共享密钥上({1}} {1}}) - 我们有我们需要的东西。以下是一些关于聚合函数的附加阅读 - 如果你自己尝试,你会更好地理解这个答案,而聚合函数是SQL最强大的部分之一。 https://www.w3schools.com/sql/sql_groupby.asp