如何使用SQL存储过程按班次、性别统计就诊患者并区分男女儿童
医院患者签到数据统计实现
需求说明
需要按天统计签到患者数据,规则如下:
- 按签到时间拆分班次:12点前为早班,12点及以后为晚班
- 按性别拆分统计当日签到的男性、女性总人数
- 单独统计当日签到的18岁及以下男童、女童数量
优化后SQL查询代码
你原有代码的分组逻辑存在问题,GROUP BY Ch.EnteredOn会按照带时分秒的完整时间戳分组,导致同一天的签到数据被拆分为多条,修正后的代码如下:
SELECT COUNT(ch.EnteredOn) AS counter, CONVERT(date, ch.EnteredOn) AS sessionDay, SUM(CASE WHEN CAST(CONVERT(CHAR(2), ch.EnteredOn, 108) AS INT) < 12 THEN 1 ELSE 0 END) AS Morning, SUM(CASE WHEN CAST(CONVERT(CHAR(2), ch.EnteredOn, 108) AS INT) >= 12 THEN 1 ELSE 0 END) AS Evening, SUM(CASE WHEN p.Gender = 1 THEN 1 ELSE 0 END) AS Male, SUM(CASE WHEN p.Gender = 2 THEN 1 ELSE 0 END) AS Female, SUM(CASE WHEN DATEDIFF(hour, P.DOB, GETDATE()) / 8766 <= 18 AND P.Gender = 1 THEN 1 ELSE 0 END) AS MChild, SUM(CASE WHEN DATEDIFF(hour, P.DOB, GETDATE()) / 8766 <= 18 AND P.Gender = 2 THEN 1 ELSE 0 END) AS FChild FROM Patient.CheckIn ch INNER JOIN Patient.Patients P ON ch.PatientId = p.PatientId GROUP BY CONVERT(date, ch.EnteredOn)
字段说明
核心依赖字段共3个,取值规则如下:
Gender:性别字段,取值1代表男性,取值2代表女性Time:对应代码中ch.EnteredOn,为患者签到时间戳DOB:患者出生日期字段,用于计算年龄
统计结果字段说明:
counter:当日总签到患者数sessionDay:统计对应的日期Morning:当日早班签到人数Evening:当日晚班签到人数Male:当日签到男性总人数Female:当日签到女性总人数MChild:当日签到18岁及以下男童人数FChild:当日签到18岁及以下女童人数
内容的提问来源于stack exchange,提问作者Umar Faraz
相关产品推荐
相关产品推荐

