我正在处理一份相当大的报告,结果我需要在 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
代码:
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
最佳答案
根据解释和示例代码,很难理解为什么您要尝试在 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'
关于sql - 微软SQL服务器: converting 3 rows to 3 columns,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22023244/