组合独特值的声明行

时间:2018-06-01 15:14:17

标签: sql sql-server-2012

我正在处理医疗索赔,其中一个索赔号最多可以有75行。每个声明都有一个代码,用于预测声明的处理方式以及我需要对两个统计数据进行处理以及有效的案例处理是将所有这些行组合在一起并抓住唯一值 - 一些声明可以有20-30行完全相同代码,我显然只需要知道这两个代码是什么,而不是每个单独的代码。我觉得这是一个简单的解决方案,但它只是逃避了我的掌握。

原始数据:

Claim Number    EX1 Ex2 Ex3 Ex4 Ex5 Ex6
123456789123    LP  DU  1O            
123456789123    LP  DU  1O            
123456789123    LP  DU  1O            
123456789123    LP  DU  1O            
123456789123    LP  DU  1O            
123456789123    LP  DU  1O            
123456789123    LP  DU  1O            
123456789123    LP  DU  1O            
123456789123    LP  DU  1O            
123456789123    LP  DU  1O            
123456789123    LP  DU  1O            
123456789123    LP  DU  1O            
123456789123    LP  DU  1O            
123456789123    LP  DU  1O            
123456789123    LP  IK  D3  AP  1O    
123456789123    LP  DU  1O            
123456789123    LP  IK  D3  AP  1O    
123456789123    LP  DU  1O            
123456789123    LP  DU  1O            
123456789123    LP  DU  1O            
123456789123    LP  IK  D3  AP  1O    
123456789123    LP  DU  1O            
123456789123    LP  DU  1O            
123456789123    LP  DU  1O            
123456789123    LP  DU  1O            
123456789123    LP  DU  1O            
123456789123    LP  DU  1O            
123456789123    LP  DU  1O            
123456789123    LP  DU  1O            
123456789123    LP  DU  1O            
123456789123    LP  DU  1O            
123456789123    LP  DU  1O            
123456789123    LP  DU  1O            
123456789123    LP  IK  D3  AP  1O    
123456789123    LP  DU  1O            
123456789123    LP  DU  1O            
123456789123    LP  DU  1O            
123456789123    LP  DU  1O            
123456789123    LP  DU  1O            
123456789123    LP  DU  1O            
123456789123    LP  DU  1O            
123456789123    LP  DU  1O            
123456789123    LP  DU  1O            
123456789123    LP  DU  1O            
123456789123    LP  DU  1O            
123456789123    LP  DU  1O            
123456789123    LP  DU  1O            
123456789123    LP  DU  1O            
123456789123    LP  DU  1O            
123456789123    LP  DU  1O            
123456789123    LP  DU  1O            
123456789123    LP  DU  1O            
123456789123    LP  DU  1O            
123456789123    LP  IK  D3  AP  1O    
123456789123    LP  DU  1O            
123456789123    LP  DU  1O            
123456789123    LP  DU  1O            
123456789123    LP  DU  1O            
123456789123    LP  DU  1O            
123456789123    LP  DU  1O            
123456789123    LP  DU  1O            
123456789123    LP  IK  D3  AP  1O    
123456789123    LP  DU  1O            
123456789123    LP  DP  AP  1O        
123456789123    LP  DU  1O            
123456789123    LP  DU  1O            
123456789123    LP  DU  1O            
123456789123    LP  DU  1O            
123456789123    LP  DU  1O            

选择区别:

Claim Number    EX1 Ex2 Ex3 Ex4 Ex5 Ex6
123456789123    LP  DP  AP  1O        
123456789123    LP  DU  1O            
123456789123    LP  IK  D3  AP  1O    

但我正在寻找的东西就像

Claim Number    Codes
123456789123    LP,DP,AP,1O,DU,IK,D3  

我能想到的唯一解决方案是通过添加行列来创建一个大文本字符串,将它们放在自己的表/子查询中,然后将它们加在一起,但我仍然可以获得所有重复的EX代码。另外,我不知道声称可能有多少不同的行,因此代码会重复而且很长。如果我只是将代码编成长文本字符串,我就可以搜索特定的声明,但我觉得有一个更优雅的解决方案。

我已经尝试过搜索这个问题,但也许我并不确切地知道我在寻找什么,所以如果这是重复的话,我很抱歉。有人问过。我还应该说我学到的任何sql都基于我需要做的事情,如果这个问题是基本的我道歉>。>

2 个答案:

答案 0 :(得分:3)

如果我理解正确,您可以取消隐藏,然后合并代码:

with oc as (
      select distinct claim, ex
      from original o cross apply
           (values (ex1), (ex2), (ex3), (ex4), (ex5)) v(ex)
     )
select o.claim,
       stuff( (select ',' + ex
               from oc
               where oc.claim = o.claim
               for xml path ('')
              ), 1, 1, ''
            ) as codes
from (select distinct claim
      from original o
     ) o;

答案 1 :(得分:1)

SQL Server 2012版本:

with CTE as (
    select distinct [Claim_Number], [EX1] ex from TestTable
    union select [Claim_Number], [EX2] ex from TestTable
    union select [Claim_Number], [EX3] ex from TestTable
    union select [Claim_Number], [EX4] ex from TestTable
    union select [Claim_Number], [EX5] ex from TestTable
    union select [Claim_Number], [EX6] ex from TestTable
)
select [Claim_Number],
  Codes = STUFF((SELECT  ','+cast([ex] AS VARCHAR ) FROM  CTE t WHERE  C.[Claim_Number]  = t.[Claim_Number]  FOR XML PATH('')),1,1,'') 
from CTE C
group by Claim_Number

SQL Fiddle DEMO LINK

PS。你可以在sql server 2017中做到这一点

尝试使用uionGroup by Claim_Number + STRING_AGG"

select [Claim_Number],STRING_AGG ( ex, ',')
from (
    select [Claim_Number], [EX1] ex from TestTable
    union select [Claim_Number], [EX2] ex from TestTable
    union select [Claim_Number], [EX3] ex from TestTable
    union select [Claim_Number], [EX4] ex from TestTable
    union select [Claim_Number], [EX5] ex from TestTable
    union select [Claim_Number], [EX6] ex from TestTable
) T
group by Claim_Number

SQL Fiddle DEMO LINK