我对SQL Server有疑问。
表:patient
pn | hospid | doj
------------------------
1 | 10 | 2015-10-14
1 | 10 | 2015-05-14
1 | 10 | 2015-08-12
第二桌:patientrefs
sdate | edate | codes | descripton | pn | hospid
-------------------------------------------------------------
2015-01-01 | 2015-09-30 | 500 | active | 1 | 10
2015-01-01 | 2015-09-30 | 501 | inactive | 1 | 10
2015-10-01 | 2016-03-31 | 500 | activestill | 1 | 10
2015-10-01 | 2016-03-31 | 501 | inactive | 1 | 10
2013-03-09 | 2013-09-12 | 300 | inactive | 1 | 10
表格公共列pn + hospid
和患者表都与sdate和patientrefs表的edate之间的dos相关。
在patientrefs表中descritpton =无效且条件之间的日期满足代码我们认为是非活动代码
在patientrefs表中descritpton<>非活动状态和条件之间的日期满足代码我们认为是活动代码
基于上面的表格,我希望输出如下:
pn|hospid|doj |inactivecodes| activecodes
------------------------------------------------
1 |10 |2015-05-14 | 501 | 500
1 |10 |2015-08-12 | 501 | 500
1 |10 |2015-10-14 | 501 | 500
我试过这样:
select
a.pn, a.hospid, a.doj,
case when b.descripton <> 'inactive' then b.codes end activecodes,
case when b.descripton = 'inactive' then b.codes end inactivecodes
from
patient a
left join
patientrefs b on a.pn = b.pn and a.hospid = b.hospid
and a.doj between b.sdate and b.edate
但该查询未返回预期结果。
我尝试了另一种方式
select
a.pn, a.hospid, a.doj, b.codes as inactivecodes
from
patient a
left join
patientrefs b on a.pn = b.pn and a.hospid = b.hospid
and a.doj between b.sdate and b.edate
where
b.descripton = 'inactive'
select
a.pn, a.hospid, a.doj, b.codes as activecode
from
patient a
left
patientrefs b on a.pn = b.pn and a.hospid = b.hospid
and a.doj between b.sdate and b.edate
where
b.descripton <> 'inactive'
这里各个查询返回预期结果,但我需要上述预期输出格式的活动和非活动代码。
请告诉我如何编写查询以在SQL Server中获得我期望的结果
答案 0 :(得分:0)
您可以使用条件聚合执行此操作:
SELECT
p.pn,
p.hospid,
p.doj,
inactivecodes = MAX(CASE WHEN pr.description = 'inactive' THEN pr.codes END),
activecodes = MAX(CASE WHEN pr.description = 'active' THEN pr.codes END)
FROM patient p
LEFT JOIN patientrefs pr
ON p.pn = pr.pn
AND p.hospid = pr.hospid
AND p.doj BETWEEN pr.sdate AND pr.edate
GROUP BY
p.pn, p.hospid, p.doj