【问题标题】:SQL Method to fill in blank rows of unique identifier填充唯一标识符空白行的SQL方法
【发布时间】:2021-06-10 04:34:33
【问题描述】:

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

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

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

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

问题在于唯一标识符 - 同一个客户端可能有多个保单编号,其中 A) 或 B) 未存储在一起。 我一直使用的是系统自己的客户端代码(与策略编号不同),它将所有策略编号存储在同一客户端下。第二个问题是索赔数据未映射到此“客户代码”。 Excel index/match/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      |        |

我考虑过使用 Self Join -

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"

这显然不起作用,更不用说当我尝试按保费包含总和时,我开始收到按条款分组的错误消息。

任何帮助将不胜感激。

结果:

t1.Client Code t1.Policy Number t1.Premium t1.Claims t2.Client Code
C1 123 500 300 C1
C2 456 100 C2
C1 767 0 C1
C1 767 0
767 800 C1
767 800

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

【问题讨论】:

  • 您的文本表和 SQL 难以阅读,因此请对 SQL 使用单声道格式。并修复表格可能是降价错误。
  • 300 去哪儿了?也就是说,为什么索赔是 800 而不是 1100?
  • 嗨,戈登,抱歉,你是正确的,总数应该是 1100。@Strawberry 我很快就会尝试这个——最近才开始研究 SQL,因为 Zoho 不允许创建表函数(只选择)。

标签: sql zoho ansi-sql


【解决方案1】:

如果你有一个唯一的标识符,这告诉我你想要一个 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", 
        "Policy Number",
        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 不允许您这样改造。希望你能做到。

【讨论】:

  • 感谢迈克。我唯一担心的是,如果我先求和,我会按保单号获得保费和索赔的总金额,但随后某些客户的保费和索赔数据可能有不同的保单号(索赔数据条目有客户代码)由于某种原因丢失)。我目前正在寻找一种方法来将这些不同的策略编号绑定在一个客户端代码下。 (请注意,只有客户代码随机丢失的声明数据)。希望这是有道理的。
  • 好的。如果不良数据是您的问题,那么我建议您检查您的数据并更新您丢失的客户代码。您可以使用已知的客户代码作为保单编号,并在缺少客户代码的地方填写相同的保单编号。此外,将您的表格建模为多个表格的好处是,每个索赔都有一个保单号,该保单号有一个客户,该客户有一个客户代码。因此,要重命名客户代码,您只需更改一条记录。如果您在没有客户端的情况下制定策略,您可以使用参照完整性来给您一个明确的错误。
  • 我现在添加了一些内容。 AS Policy ON Policy."Client Code" = table1."Client Code".
  • 我想说不要尝试让您的查询在缺少客户端代码的情况下工作,因为查询变得更加复杂且容易出错,与修复丢失数据相比,您每次进行查询时都必须适应这一点.
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-07
  • 2020-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多