需要帮助查询SQL Server

时间:2015-12-10 07:38:09

标签: sql-server sql-server-2008

我对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中获得我期望的结果

1 个答案:

答案 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