我正在处理一份相当大的报告,因为事实证明我需要将保险信息分为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
答案 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
感谢所有回复的人。