将一列的多行转换为多列(即时)

时间:2018-11-21 15:57:37

标签: sql sql-server tsql

我到处都在寻找解决问题的方法,但是它们似乎都涉及看似复杂的方法,例如数据透视表,交叉表等。似乎对于没有的问题,必须有一个更简单的解决方案在我看来,这是一个特别复杂的问题。我正在使用MS SQL Server 2014(64位)和MS Report Builder版本3。(我的操作系统是NT 6.3)。我们有一个关系数据库,其中包含大量的表(这里太多了,无法列出),但是下面的代码给出了相关的表。

目前,我正在使用STUFF...FOR XML PATH方法将患者诊断从多行合并为单行。我想做的是为每个诊断找到一列(老板想要在Excel中进行一些后处理,他希望以这种格式进行处理)。诊断数是一个不确定的数字,介于0到5之间。

我的输出是这样的(这非常简化-实际上有10列,但说明了这一点):

Patient  Diagnoses
ID1      C32.1,HN02
ID2      C13.9
ID3      C11.9,HN04
ID4      C08.9,HN08
ID5      C80,XX01,BR22
ID6       

没有任何串联,输出为:

Patient  Diagnoses
ID1      C32.1
ID1      HN02
ID2      C13.9
ID3      C11.9
ID3      HN04
ID4      C08.9
ID4      HN08
ID5      C80
ID5      XX01
ID5      BR22
ID6       

我想要的输出是这样:

Patient  Diagnosis1  Diagnosis2  Diagnosis3 Diagnosis4
ID1      C32.1       HN02
ID2      C13.9
ID3      C11.9       HN04
ID4      C08.9       HN08
ID5      C80         XX01        BR22
ID6       

我正在使用的代码(基本上)是这样的:

SET transaction isolation level read uncommitted;

SELECT top (1000)
p.PatientId
,'Diagnoses'= STUFF((
        SELECT DISTINCT
        ',' + LTRIM(RTRIM(diag.DiagnosisCode))

        FROM
            Diagnosis diag
            INNER JOIN CourseDiagnosis cd on (cd.DiagnosisSer=diag.DiagnosisSer and cd.CourseSer=c.CourseSer)

        FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 1, '')

FROM
Patient p
INNER JOIN Course c on p.PatientSer=c.CourseSer

有人有什么好主意吗?

1 个答案:

答案 0 :(得分:2)

我将使用条件聚合来执行此操作,但是关键是[[[[['p'], ['q'], ['t'], ['u']], [['r'], ['s'], ['v'], ['w']]]], [[[['p'], ['q'], ['t'], ['w']], [['r'], ['s'], ['v'], ['u']]]], [[[['p'], ['q'], ['v'], ['u']], [['r'], ['s'], ['t'], ['w']]]], [[[['p'], ['q'], ['v'], ['w']], [['r'], ['s'], ['t'], ['u']]]], [[[['p'], ['s'], ['t'], ['u']], [['r'], ['q'], ['v'], ['w']]]], [[[['p'], ['s'], ['t'], ['w']], [['r'], ['q'], ['v'], ['u']]]], [[[['p'], ['s'], ['v'], ['u']], [['r'], ['q'], ['t'], ['w']]]], [[[['p'], ['s'], ['v'], ['w']], [['r'], ['q'], ['t'], ['u']]]]]

row_number()