当值不替换,否则找到值并使用?

时间:2017-09-13 16:31:52

标签: sql sql-server

希望我能在这里有意义。

我正在处理索赔数据,索赔人可以是他们自己政策的成员,依赖别人的政策,或两者兼而有之。

当索赔人提出索赔时,索赔附在保单编号上。

我试图为每个索赔人获得一行但是当我尝试加入以获取此政策号时,我得到多行。

我需要保单编号,但每个索赔人也需要一行。

关于如何最好地解决这个问题的任何想法?

这是我需要完成的事情。

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。)

1 个答案:

答案 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

一些解释:

  • 公用表表达式(CTE)创建一个"属于"的结果集。到当前查询的范围。它类似于子查询,但有点不同,因为它在主查询上方定义,而不是在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