我到处都在寻找解决问题的方法,但是它们似乎都涉及看似复杂的方法,例如数据透视表,交叉表等。似乎对于没有的问题,必须有一个更简单的解决方案在我看来,这是一个特别复杂的问题。我正在使用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
有人有什么好主意吗?
答案 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()