SQL条件求和和分组

时间:2015-06-04 06:56:25

标签: sql grouping sybase conditional-statements

我有一个问题,试图总结患者在医院的住院时间。以下是数据的示例

| Patient | Admission_ID | Admission_Event_ID | Admission_Event_Type  | Start Date | End Date   | Duration | Linked_Admission |
| P0001   | ADM0001      | AE1                | (formal) Separation   | 2012-12-18 | 2012-12-18 | 0        | ADM0002          |
| P0001   | ADM0001      | AE2                | Statistical Admission | 2012-12-17 | 2012-12-18 | 1        | ADM0002          |
| P0001   | ADM0002      | AE3                | Statistical Separation| 2012-12-17 | 2012-12-17 | 0        | NULL             |
| P0001   | ADM0002      | AE4                | (formal) Admission    | 2012-11-30 | 2012-12-17 | 17       | NULL             |
| P0002   | ADM0003      | AE5                | (formal) Admission    | 2012-11-30 | 2012-12-25 | 25       | NULL             |
. . . 

编辑:忘记提及,有一个链接入院ID的列(仅在患者统计分离并被录取时使用)

根据定义,每位患者从入院开始直到他们分居为止计算住院时间(统计分离和入院继续进行,但他们会给予新的入院ID

运行报告以查找医院及其单位的平均住院时间(ALOS),用户选择两个日期进行报告。我已经使用了CTE(我们称之为 CTESep )来获取报告期间正式分开的所有患者。然后我使用另一个CTE(称为 CTEAdmissions )来获得CTESep内患者的所有入院许可。这就是我被卡住的地方。

我需要总结患者的持续时间以获得该患者的总住院时间(这是ADM0001和ADM0002的组合),因此总LOS将为18,而不是17和1。 我的想法是

    ORDER BY Patient
    , End_Date DESC
    , adm_id
    , CASE WHEN 
            Admission_Event_Type  = '(formal) Separation   ' THEN 1
           WHEN Admission_Event_Type  = 'Statistical Admission ' THEN 2
           WHEN Admission_Event_Type  = 'Statistical Separation' THEN 3
           WHEN Admission_Event_Type  = '(formal) Admission    ' THEN 4 
      END ASC

然后根据条件总结持续时间。条件规则是'开始总结每位患者从正式分居到正式入院的入院时间' 。哪个我不知道该怎么做。 我试过了:

SELECT SUM(Duration) OVER(PARTITION BY Patient) AS 'Sum'

但是,这将为我提供所有入院患者的总LOS(如果他们在该报告期内有多个分居) 我也试过了

 SELECT SUM(Duration) OVER(PARTITION BY Patient, Admission_ID) AS 'Sum'

但当然,这给了我正式录取和统计分离之间的患者LOS(而不是实际定义的LOS)。

任何人都有不同的解决方法吗?顺便说一句,使用Sybase

1 个答案:

答案 0 :(得分:0)

这个怎么样:

select patientid,
       admissionid,
       datediff(day, 
                  max(case when Admission_Event_Type = '(formal) Separation   ' then startdate end),
                  max(case when Admission_Event_Type = '(formal) Admission    ' then enddate end)
               ) as total_length
from data
group by patientid, admissionid