将多行合并为具有重复列的单行

时间:2019-04-30 23:30:37

标签: sql sql-server

我有一张桌子,每个客户有多个保险单。每条记录一项政策。 我需要在每个客户的一行中代表所有策略。

我已经阅读了所有类似的问题,它们可能很接近,但是我似乎无法将答案转化为我的情况。

我的桌子看起来像这样

enter code here  Client-ID     Ins-Company   Policy-Number   Start-Date
                 1             BCBS          BSBC1           2018-01-01
                 1             Aetna         Aetna1          2017-01-01
                 1             Self-Pay      N/A             2016-01-01
                 2             Self-Pay      N/A             2015-01-01
                 3             BCBS          BCBS3           2014-01-01
                 3             Self-Pay      N/A             2013-01-01

预期结果:

enter code here Client-ID Ins-Co1  Policy1  Start1      Ins-Co2   Policy2 Start2     Ins-Co3  Policy3 Start3
                1         BCBS     BCBS1    2018-01-01  Aetna     Aetna1  2017-01-01 Self-Pay  N/A    2016-01-01
                2         Self-Pay N/A      2015-01-01
                3         BCBS     BCBS3    2014-01-01  Self-Pay   N/A    2013-01-01 

需要使用这些记录创建另一个表

1 个答案:

答案 0 :(得分:0)

我使用以下代码创建了所需的结果。

首先,我使用以下函数创建了添加了行号的源表的视图:
ROW_NUMBER() OVER(PARTITION BY a.Client_ID ORDER BY a.Billing_Order ASC) AS Row_No

并构建了以下代码

enter code hereDECLARE @sql varchar(max)
DECLARE @colList varchar(max)

--create dynamic list of columns
SELECT @colList = 
STUFF
(
  (
   SELECT + ',' + 
   quotename(colName + Row_No)
   FROM Credible_Client_Insurance_Raw_Data_Query
   CROSS APPLY
   (
     SELECT 1 As Ord, 'Payer_ID' ColName UNION ALL
     SELECT 2 As Ord, 'Billing_Order' UNION ALL
     SELECT 3 As Ord, 'Insurance_ID' UNION ALL
     SELECT 4 As Ord, 'Group_No' UNION ALL
     SELECT 5 As Ord, 'Copay_Fee' UNION ALL
     SELECT 6 As Ord, 'Start_Date' 
    ) v 
    GROUP BY colName, Ord, Row_No
    ORDER BY Row_No, Ord
   for xml path(''), type
   ).value('/','varchar(max)'),1,1,''
)

--unpivot columns into rows and then apply pivot
SET @sql
= '
SELECT Client_ID, ' + @colList + ' 
FROM
(
   SELECT Client_ID, ColVal,
   colName + Row_No ColName
   FROM Credible_Client_Insurance_Raw_Data_Query
   CROSS APPLY
   (
     SELECT Payer_ID As ColVal, ''Payer_ID'' ColName UNION ALL
     SELECT Billing_Order, ''Billing_Order'' UNION ALL
     SELECT Insurance_ID, ''Insurance_ID'' UNION ALL
     SELECT Group_No, ''Group_No'' UNION ALL
     SELECT CAST(Copay_Fee AS VARCHAR), ''Copay_Fee'' UNION ALL
     SELECT CAST(Start_Date AS VARCHAR), ''Start_Date'' 
   ) v 
) A
PIVOT
(
   MAX(ColVal) FOR ColName IN (' + @colList + ')
) P1 '


EXEC(@sql)

代码是从另一个问题复制的

基于单列在多列上旋转


现在我有一个后续问题:

现在,我创建了一个查询,该查询提供了所需的结果

我需要将结果放入表格中。

我无法接受此查询并将其放入VIEW,因为它以Declare语句(对于Views是非法的)开头

那么如何将查询数据传输到表中?