Microsoft SQL Server:将3行转换为3列

时间:2014-02-25 18:39:12

标签: sql sql-server pivot rows

我正在处理一份相当大的报告,因为事实证明我需要将保险信息分为1行而不是3行。我可以通过基本的SQL编码获得,但是当涉及到数据透视表时和其他高级任务我陷入困境并且让人感到困惑,所以我想我会转向你们。我查看了几个将行更改为列并开始理解它的示例,但是当涉及实际编码时,它开始变得一团糟。 :(

问题
试图在一行中获得所有3种保险,而不是为所有重复的患者数据打印每个保险的新行。

EXAMPLE
TYPE  ACCTNUM_2    PaySrc_1   
2     000001       MEDICARE
2     000001       BLUE CROSS
2     000152       BLUE CROSS

I would like to display it as 
TYPE  ACCTNUM_2 ... PaySrc_1    PaySrc_2    PaySrc3
2     000001        MEDICARE    BLUE CROSS
2     000152        BLUE CROSS

CODE:

DECLARE
    @StartDate DateTime,
    @EndDate DateTime,
    SET @StartDate = '10/28/2013 00:00:000'
    SET @EndDate = '10/28/2013 23:59:000'
    SET @RecordType = '2'

SELECT 
    @RecordType AS RecordType
    ,ISNULL(AbstractData.AccountNumber,'') AS AcctNum
    ,ISNULL(AbsInsurances.InsuranceName,'') AS PaySrc_1
FROM AbstractData  
    JOIN AbsInsurances
        ON (AbsInsurances.VisitID = AbstractData.VisitID)
        AND (AbsInsurances.SourceID = AbstractData.SourceID)


WHERE AbstractData.DischargeDateTime BETWEEN '05/15/2012 00:00:000' and '08/15/2012 00:00:000'
ORDER BY AbstractData.DischargeDateTime,
AbstractData.PatientID 

2 个答案:

答案 0 :(得分:1)

根据说明和示例代码,很难理解为什么要在T-SQL中尝试这样做。如果您有可以使用的报告工具,请尝试使用它。

有一种方法可以连接名称列表,但是你必须牺牲你提出的报告结构(略)。考虑连接AbsInsurances.PaySrc_12中的值。这是一个你可能能够为你工作的片段。如果你确实有效,我强烈建议你将它作为临时解决方案使用,直到找到更实用/可维护的方法。

SELECT DISTINCT ACCTNUM_2, STUFF(InsuranceProviders.Names, 1, 1, '') PAYSRC_12 
FROM AbstractData t
       CROSS APPLY (
                    SELECT ',' + PaySrc_12 
                    FROM AbstractData
                    WHERE ACCTNUM_2 = t.ACCTNUM_2
                    FOR XML PATH('')
                    )InsuranceProviders(Names) 
    WHERE ACCTNUM_2='000001'  

答案 1 :(得分:1)

使用子查询工作正常,并根据需要显示数据:

,(SELECT ISNULL(AI.InsuranceName,'')
    FROM AbsInsurances AI
    WHERE AI.InsuranceSeqID ='1' AND (AI.VisitID = AbstractData.VisitID))
    AS PaySrc_12
,(SELECT ISNULL(AI.InsuranceName,'')
    FROM AbsInsurances AI
    WHERE AI.InsuranceSeqID ='2' AND (AI.VisitID = AbstractData.VisitID))
    AS PaySrc_13
,(SELECT ISNULL(AI.InsuranceName,'')
    FROM AbsInsurances AI
    WHERE AI.InsuranceSeqID ='3' AND (AI.VisitID = AbstractData.VisitID))
    AS PaySrc_14

感谢所有回复的人。