使用SQL Server将列拆分为不同的字段

时间:2017-09-28 17:50:07

标签: sql-server sql-server-2008

如何将源表转换为目标表? 例如,P111和C111连接。我希望它们在同一行,每当它们连接时,case_type应该是策略。

1.索赔/政策组合共享一个ID,其中P为政策前缀,C为前言。

2.对于给定的ID,声明和政策的保单日期是相同的。

3.政策和索赔之间存在1比1的关系。

4.如果有政策和索赔,则case_type应为policy。

Source Table                               Target Table
+-----------+-------------+-----------+    +--------+-------+-------------+-----------+
| policy_id | policy_date | case_type |    | Policy | Claim | policy_date | case_type |
+-----------+-------------+-----------+    +--------+-------+-------------+-----------+
| p111      | 2017-05-10  | Policy    |    | p103   | c103  | 2017-06-10  | Policy    |
| c111      | 2017-05-10  | Claim     |    | p111   | c111  | 2017-05-10  | Policy    |
| p103      | 2017-06-10  | Policy    |    | p124   | NULL  | 2017-05-10  | Policy    |
| c103      | 2017-06-10  | Claim     |    | NULL   | c133  | 2017-06-10  | Claim     |
| p124      | 2017-05-10  | Policy    |    | p144   | NULL  | 2017-09-10  | Policy    |
| c133      | 2017-06-10  | Claim     |    | p155   | c155  | 2017-07-10  | Policy    |
| p155      | 2017-06-10  | Policy    |    | NULL   | c177  | 2017-09-10  | Claim     |
| c155      | 2017-07-10  | Claim     |    |AI100   |EC100   |2017-08-10| Policy   +--------+-------+--------------+
| p144      | 2017-09-10  | Policy    |    
| c177      | 2017-09-10  | Claim     |  
| AI100     | 2017-08-10  | Policy    |
| EC100     | 2017-08-10  | Claim     |
+-----------+-------------+-----------+    

1 个答案:

答案 0 :(得分:1)

这个答案有很多假设,因为你没有提供任何关于你希望你的第一张桌子到达第二张桌子的逻辑。以下是我做出的假设:

  1. 声明/政策组合共享一个ID,其前缀为P表示策略,C表示声明。
  2. 对于给定的ID,声明和政策的保单日期相同。
  3. 政策和声明之间存在1对1的关系。
  4. 如果存在政策和声明,则case_type应为policy。
  5. 根据这些假设,这是我用来测试它的表变量:

    编辑:更新了新的样本数据

    <noscript>
      <div>Javascript isn't enabled</div>
    </noscript>
    <script>
      let jsenabled = document.createElement("div");
      jsenabled.innerText = "Javascript is enabled";
      document.body.appendChild(jsenabled);
    </script>

    这是获取您正在寻找的结果集的查询。

    DECLARE @tbl TABLE (
    policy_id NVARCHAR(5),
    policy_date date,
    case_type NVARCHAR(6)
    )
    
    INSERT @tbl VALUES
    ('p111','05/10/2017','Policy'), ('c111','05/10/2017','Claim'),
    ('p103','06/10/2017','Policy'), ('c103','06/10/2017','Claim'),
    ('p124','05/10/2017','Policy'), ('c133','06/10/2017','Claim'),
    ('p155','07/10/2017','Policy'), ('c155','07/10/2017','Claim'),
    ('p144','09/10/2017','Policy'), ('c177','09/10/2017','Claim'),
    ('AI100','2017-08-10','Policy'), ('EC100','2017-08-10','Claim')
    

    子串选项对于当前示例集是不必要的,但更彻底。它将删除任何字母前缀数字,最多10位数(int数据类型的限制)。有关详细信息,请参阅this awesome blog,但由于我们仅删除了在步骤2中停止的前缀字母。