在 SQL 服务器中合并相似的行
Combining Similar Rows in SQL Server
我已经为此搜索了解决方案,但未能找到。我是新手,正在尝试合并不太重复的行。我已经尝试了 DISTINCT
和 JOIN
的知识,但此时我已经完全筋疲力尽了...
我的结果是这样的:
我正在努力:
我的查询如下所示:
Select Distinct
'' As 'Sendout Acc ID',
r.ACC_ID As 'Pending Acc ID',
r.PAT_ID As 'Patient ID',
Concat (pa.L_NAME, ', ', pa.F_NAME) As 'Patient Name',
Convert (VarChar, pa.BIRTH, 101) As 'Patient DoB',
Case
When (pa.GENDER = 'M') Then 'Male'
When (pa.GENDER = 'F') Then 'Female'
End 'Gender',
Convert (VarChar, r.DRAW_DATE, 101) As 'Collection Date',
Case
When (rp.PANEL_ID Is Null) Then ''
When (rp.PANEL_ID = '6600') Then 'Ordered'
End 'SMC Cardiac Troponin-I',
Case
When (rp.PANEL_ID Is Null) Then ''
When (rp.PANEL_ID = '6601') Then 'Ordered'
End 'SMC Endothelin',
Case
When (rp.PANEL_ID Is Null) Then ''
When (rp.PANEL_ID = '6602') Then 'Ordered'
End 'SMC Interleukin-6',
Case
When (rp.PANEL_ID Is Null) Then ''
When (rp.PANEL_ID = '6603') Then 'Ordered'
End 'SMC Interleukin-17A',
Case
When (rp.PANEL_ID Is Null) Then ''
When (rp.PANEL_ID = '6604') Then 'Ordered'
End 'SMC Interleukin-10',
Case
When (rp.PANEL_ID Is Null) Then ''
When (rp.PANEL_ID = '6605') Then 'Ordered'
End 'SMC TNF-alpha',
Case
When (rp.PANEL_ID Is Null) Then ''
When (rp.PANEL_ID = '6531') Then 'Ordered'
End 'Leptin'
From
LD..LD1.REQUISITIONS r
Join
LD..LD1.PATIENTS pa On r.PAT_ID = pa.PAT_ID
Left Join
LD..LD1.REQ_PANELS rp On rp.ACC_ID = r.ACC_ID
Where
(rp.PANEL_ID = 6600 or rp.PANEL_ID = 6601 or rp.PANEL_ID = 6602 or
rp.PANEL_ID = 6603 or rp.PANEL_ID = 6604 or rp.PANEL_ID = 6605 or
rp.PANEL_ID = 6531)
And rp.DEL_FLAG = 'F'
And ((rp.CREATED_DATE > @StartDate And rp.CREATED_DATE < @EndDate And r.CREATED_BY <> ('-1'))
Or (r.RECEIVED_DATE > @StartDate And r.RECEIVED_DATE < @EndDate And r.CREATED_BY = ('-1')))
And r.ACC_ID Not In (Select ACC_ID From LD..LD1.VW_NOTPATIENTS)
Order By
r.ACC_ID Asc
如有任何帮助,我们将不胜感激。谢谢。
您可以通过将您的查询放在下面来进行分组:
Select [sendout Acc ID], [Pending Acc ID], [Patient ID], [Patient Name], [Patient DOB], Gender, [Collection Date],
max([SMC Cardiac Troponin-I]), max([SMC Endothelin]) ...
from (
your query .....
)
group by [sendout Acc ID], [Pending Acc ID], [Patient ID], [Patient Name], [Patient DOB], Gender, [Collection Date]
在子查询中删除查询中的 Order by 并将其放在 group by 之后
明智地使用 MAX()
和 GROUP BY
将为您提供所需的东西:
Select Distinct
'' As 'Sendout Acc ID',
r.ACC_ID As 'Pending Acc ID',
r.PAT_ID As 'Patient ID',
Concat (pa.L_NAME, ', ', pa.F_NAME) As 'Patient Name',
Convert (VarChar, pa.BIRTH, 101) As 'Patient DoB',
Case
When (pa.GENDER = 'M') Then 'Male'
When (pa.GENDER = 'F') Then 'Female'
End 'Gender',
Convert (VarChar, r.DRAW_DATE, 101) As 'Collection Date',
MAX(
Case
When (rp.PANEL_ID = '6600')
Then 'Ordered'
ELSE ''
End
) 'SMC Cardiac Troponin-I',
MAX(
Case
When (rp.PANEL_ID = '6601')
Then 'Ordered'
ELSE ''
End
) 'SMC Endothelin',
MAX(
Case
When (rp.PANEL_ID = '6602')
Then 'Ordered'
ELSE ''
End
) 'SMC Interleukin-6',
MAX(
Case
When (rp.PANEL_ID = '6603')
Then 'Ordered'
ELSE ''
End
) 'SMC Interleukin-17A',
MAX(
Case
When (rp.PANEL_ID = '6604')
Then 'Ordered'
ELSE ''
End
) 'SMC Interleukin-10',
MAX(
Case
When (rp.PANEL_ID Is Null) Then ''
When (rp.PANEL_ID = '6605') Then 'Ordered'
End
) 'SMC TNF-alpha',
MAX(
Case
When (rp.PANEL_ID Is Null) Then ''
When (rp.PANEL_ID = '6531') Then 'Ordered'
End
) 'Leptin'
From
LD..LD1.REQUISITIONS r
Join
LD..LD1.PATIENTS pa On r.PAT_ID = pa.PAT_ID
Left Join
LD..LD1.REQ_PANELS rp On rp.ACC_ID = r.ACC_ID
Where
(rp.PANEL_ID = 6600 or rp.PANEL_ID = 6601 or rp.PANEL_ID = 6602 or
rp.PANEL_ID = 6603 or rp.PANEL_ID = 6604 or rp.PANEL_ID = 6605 or
rp.PANEL_ID = 6531)
And rp.DEL_FLAG = 'F'
And ((rp.CREATED_DATE > @StartDate And rp.CREATED_DATE < @EndDate And r.CREATED_BY <> ('-1'))
Or (r.RECEIVED_DATE > @StartDate And r.RECEIVED_DATE < @EndDate And r.CREATED_BY = ('-1')))
And r.ACC_ID Not In (Select ACC_ID From LD..LD1.VW_NOTPATIENTS)
GROUP BY
r.ACC_ID,
r.PAT_ID,
Concat (pa.L_NAME, ', ', pa.F_NAME),
Convert (VarChar, pa.BIRTH, 101),
Case
When (pa.GENDER = 'M') Then 'Male'
When (pa.GENDER = 'F') Then 'Female'
End,
Convert (VarChar, r.DRAW_DATE, 101)
Order By
r.ACC_ID Asc
我已经为此搜索了解决方案,但未能找到。我是新手,正在尝试合并不太重复的行。我已经尝试了 DISTINCT
和 JOIN
的知识,但此时我已经完全筋疲力尽了...
我的结果是这样的:
我正在努力:
我的查询如下所示:
Select Distinct
'' As 'Sendout Acc ID',
r.ACC_ID As 'Pending Acc ID',
r.PAT_ID As 'Patient ID',
Concat (pa.L_NAME, ', ', pa.F_NAME) As 'Patient Name',
Convert (VarChar, pa.BIRTH, 101) As 'Patient DoB',
Case
When (pa.GENDER = 'M') Then 'Male'
When (pa.GENDER = 'F') Then 'Female'
End 'Gender',
Convert (VarChar, r.DRAW_DATE, 101) As 'Collection Date',
Case
When (rp.PANEL_ID Is Null) Then ''
When (rp.PANEL_ID = '6600') Then 'Ordered'
End 'SMC Cardiac Troponin-I',
Case
When (rp.PANEL_ID Is Null) Then ''
When (rp.PANEL_ID = '6601') Then 'Ordered'
End 'SMC Endothelin',
Case
When (rp.PANEL_ID Is Null) Then ''
When (rp.PANEL_ID = '6602') Then 'Ordered'
End 'SMC Interleukin-6',
Case
When (rp.PANEL_ID Is Null) Then ''
When (rp.PANEL_ID = '6603') Then 'Ordered'
End 'SMC Interleukin-17A',
Case
When (rp.PANEL_ID Is Null) Then ''
When (rp.PANEL_ID = '6604') Then 'Ordered'
End 'SMC Interleukin-10',
Case
When (rp.PANEL_ID Is Null) Then ''
When (rp.PANEL_ID = '6605') Then 'Ordered'
End 'SMC TNF-alpha',
Case
When (rp.PANEL_ID Is Null) Then ''
When (rp.PANEL_ID = '6531') Then 'Ordered'
End 'Leptin'
From
LD..LD1.REQUISITIONS r
Join
LD..LD1.PATIENTS pa On r.PAT_ID = pa.PAT_ID
Left Join
LD..LD1.REQ_PANELS rp On rp.ACC_ID = r.ACC_ID
Where
(rp.PANEL_ID = 6600 or rp.PANEL_ID = 6601 or rp.PANEL_ID = 6602 or
rp.PANEL_ID = 6603 or rp.PANEL_ID = 6604 or rp.PANEL_ID = 6605 or
rp.PANEL_ID = 6531)
And rp.DEL_FLAG = 'F'
And ((rp.CREATED_DATE > @StartDate And rp.CREATED_DATE < @EndDate And r.CREATED_BY <> ('-1'))
Or (r.RECEIVED_DATE > @StartDate And r.RECEIVED_DATE < @EndDate And r.CREATED_BY = ('-1')))
And r.ACC_ID Not In (Select ACC_ID From LD..LD1.VW_NOTPATIENTS)
Order By
r.ACC_ID Asc
如有任何帮助,我们将不胜感激。谢谢。
您可以通过将您的查询放在下面来进行分组:
Select [sendout Acc ID], [Pending Acc ID], [Patient ID], [Patient Name], [Patient DOB], Gender, [Collection Date],
max([SMC Cardiac Troponin-I]), max([SMC Endothelin]) ...
from (
your query .....
)
group by [sendout Acc ID], [Pending Acc ID], [Patient ID], [Patient Name], [Patient DOB], Gender, [Collection Date]
在子查询中删除查询中的 Order by 并将其放在 group by 之后
明智地使用 MAX()
和 GROUP BY
将为您提供所需的东西:
Select Distinct
'' As 'Sendout Acc ID',
r.ACC_ID As 'Pending Acc ID',
r.PAT_ID As 'Patient ID',
Concat (pa.L_NAME, ', ', pa.F_NAME) As 'Patient Name',
Convert (VarChar, pa.BIRTH, 101) As 'Patient DoB',
Case
When (pa.GENDER = 'M') Then 'Male'
When (pa.GENDER = 'F') Then 'Female'
End 'Gender',
Convert (VarChar, r.DRAW_DATE, 101) As 'Collection Date',
MAX(
Case
When (rp.PANEL_ID = '6600')
Then 'Ordered'
ELSE ''
End
) 'SMC Cardiac Troponin-I',
MAX(
Case
When (rp.PANEL_ID = '6601')
Then 'Ordered'
ELSE ''
End
) 'SMC Endothelin',
MAX(
Case
When (rp.PANEL_ID = '6602')
Then 'Ordered'
ELSE ''
End
) 'SMC Interleukin-6',
MAX(
Case
When (rp.PANEL_ID = '6603')
Then 'Ordered'
ELSE ''
End
) 'SMC Interleukin-17A',
MAX(
Case
When (rp.PANEL_ID = '6604')
Then 'Ordered'
ELSE ''
End
) 'SMC Interleukin-10',
MAX(
Case
When (rp.PANEL_ID Is Null) Then ''
When (rp.PANEL_ID = '6605') Then 'Ordered'
End
) 'SMC TNF-alpha',
MAX(
Case
When (rp.PANEL_ID Is Null) Then ''
When (rp.PANEL_ID = '6531') Then 'Ordered'
End
) 'Leptin'
From
LD..LD1.REQUISITIONS r
Join
LD..LD1.PATIENTS pa On r.PAT_ID = pa.PAT_ID
Left Join
LD..LD1.REQ_PANELS rp On rp.ACC_ID = r.ACC_ID
Where
(rp.PANEL_ID = 6600 or rp.PANEL_ID = 6601 or rp.PANEL_ID = 6602 or
rp.PANEL_ID = 6603 or rp.PANEL_ID = 6604 or rp.PANEL_ID = 6605 or
rp.PANEL_ID = 6531)
And rp.DEL_FLAG = 'F'
And ((rp.CREATED_DATE > @StartDate And rp.CREATED_DATE < @EndDate And r.CREATED_BY <> ('-1'))
Or (r.RECEIVED_DATE > @StartDate And r.RECEIVED_DATE < @EndDate And r.CREATED_BY = ('-1')))
And r.ACC_ID Not In (Select ACC_ID From LD..LD1.VW_NOTPATIENTS)
GROUP BY
r.ACC_ID,
r.PAT_ID,
Concat (pa.L_NAME, ', ', pa.F_NAME),
Convert (VarChar, pa.BIRTH, 101),
Case
When (pa.GENDER = 'M') Then 'Male'
When (pa.GENDER = 'F') Then 'Female'
End,
Convert (VarChar, r.DRAW_DATE, 101)
Order By
r.ACC_ID Asc