填充唯一标识符空白行的SQL方法

问题描述

第一次发帖希望得到帮助。

极少的编码经验,因此行话可能会令人困惑。

我正在尝试在 Zoho 中使用 sql 来清理数据。

数据由 A) 每份保单的交易数据(保费、费用、净收益) B) 索赔数据(发生金额)

问题在于唯一标识符 - 同一客户端可能有多个保单编号,其中 A) 或 B) 未存储在一起。 我一直在使用的是系统自己的客户端代码(与保单编号不同),它将所有保单编号存储在同一客户端下。第二个问题是索赔数据未映射到此“客户端代码”。 Excel 索引/匹配/ vlookup 在此期间一直是我的首选并且运行良好,但是我们正在转向通过 sql 运行的 Zoho。

例如

| Client Code | Policy Number  | Premium  | Claims |
| --------    | -------------- | -------- | ------ |
| C1          | 123            | 500      | 300    |
| C2          | 456            | 100      |        |
| C1          | 767            | 0        |        | <---
|             | 767            |          | 800    | <--- want these columns put all under C1

问题:如何使用 sql 将左下角的空白填写为 C1,然后将每个客户(C1 和 C2)与他们的总保费和索赔金额分组?

目标:

| Client Code |  Premium  | Claims |
| --------    | --------- | ------ | 
| C1          |  500      | 1100   |
| C2          |  100      |        |

我想过使用自连接 -

SELECT 
t1."Client Code",t1."Policy Number",t1."Premium",t1."Claims",t2."Client Code"
FROM table1 as t1
FULL OUTER JOIN 
   (SELECT 
   "Policy Number","Client Code" 
   FROM table1) t2 
ON t1."Policy Number" = t2."Policy Number"

这显然不起作用,更不用说当我尝试按保费包含金额时,我开始收到 group by 条款错误消息。

任何帮助将不胜感激。

结果:

t1.客户端代码 t1.Policy Number t1.Premium t1.索赔 t2.Client 代码
C1 123 500 300 C1
C2 456 100 C2
C1 767 0 C1
C1 767 0
767 800 C1
767 800

我排除的其他需要考虑的因素:保单年份、由于每月/每年付款而产生的更多交易数据线等。

解决方法

如果你有一个唯一的标识符,那就告诉我你想要一个 INNER 连接。查看内连接与外连接的维恩图。内部连接只会让你交叉,所以没有空格。左外连接或右外连接将在一个中显示值,在另一个中显示可能的空白。您可能不需要完全其他加入。我很少遇到这种情况。

关于聚合或分组。您需要 GROUP BY 和 SUM。通过按客户端代码分组,该字段将成为唯一

在这种情况下,您只有一个包含所有数据的表,因此不需要查看 table1 本身是否需要连接。哦,我看到一个问题,针对同一保单的多项索赔将使保单保费成本出现多次,然后会错误地累加起来。

我将不考虑保单编号,因为您的理想表格确实使用了它,并且希望跨保单的总数而不是按保单。

综合起来。

首先,忽略溢价。不要一次做太多。建立起来。

SELECT 
  "Client Code",SUM("Claims") AS `Total Claims`
FROM table1
GROUP BY "Client Code"
Client code    Total claims
C1                   800
C2                   0

现在只是解决溢价问题。我假设保单号码的保费是固定的(也许不是?)但是同一客户的多个保单可能碰巧有相同的保费。我不知道你是如何随着时间的推移增加保费的......?您必须根据业务逻辑来解决这个问题。

SELECT DISTINCT
  "Client Code","Policy Number","Premium"
FROM table1

结果将是唯一的行。客户 ID 将重复,但如果保费价值保持不变,保单编号应该是唯一的。

然后您添加聚合以获取客户跨保单的总保费。但我们将把它留在下面。

然后您将两个表连接在一起以处理索赔和保费。

SELECT 
    table1."Client Code",SUM(table1.Claims) AS `Total Claims`,SUM(Policy.Premium) AS `Total Premiums`
FROM table1
INNER JOIN (
    SELECT DISTINCT
        "Client Code",Premium
     FROM table1
) AS Policy ON Policy."Client Code" = table1."Client Code"
GROUP BY "Client Code"

如果您想查看底层数据以了解连接是否有意义,那么您可以删除 SUM 和 SUM 并取出 GROUP BY 行。


您的表格和字段的命名也很笨拙。 table1 和 t1 和 t2 是模糊的。您的所有数据都来自对建模不利的 table1。您更希望有一个客户及其代码表,而其他表通过行 ID(如“1”或“789”)引用客户。

而且你需要到处都是字段引用。

更好的结构应该是这样的。可能是索赔表(基于事件)和政策(基于合同)。

client.code
policy.client_id

policy.policy_number
policy.premium_value

claim.value
claim.policy_id

也许 Zoho 不允许您像这样改造。希望你能做到。