如何通过SQL统计医生月度出诊天数(单日多预约计1天)
嘿,这个需求其实挺常见的,核心就是统计医生有预约的唯一日期数量——不管当天有多少个预约,都只算1天。我给你几个实用的SQL方案,适配不同场景:
基础方案:统计有预约记录的医生出诊天数
假设你的预约表叫appointments,包含doctor_id(医生ID)和appointment_date(预约日期,可能是带时分秒的DATETIME类型)。下面的SQL适用于大多数数据库(MySQL、PostgreSQL、SQL Server等):
SELECT doctor_id, COUNT(DISTINCT DATE(appointment_date)) AS monthly_working_days FROM appointments WHERE -- 筛选2024年12月的数据,年份可根据需求调整 EXTRACT(YEAR FROM appointment_date) = 2024 AND EXTRACT(MONTH FROM appointment_date) = 12 GROUP BY doctor_id;
关键逻辑说明:
DATE(appointment_date):如果你的预约日期带时分秒,一定要用这个函数转成纯日期,不然同一天不同时间的预约会被当成不同条目,导致计数错误。COUNT(DISTINCT ...):对去重后的日期计数,完美实现“当天不管多少预约都算1天”的需求。
进阶方案:包含所有医生(即使当月无预约)
如果需要把所有医生都列出来,哪怕他们12月没有任何预约(显示出诊天数为0),可以左连接医生表(假设医生表叫doctors,主键doctor_id):
SELECT d.doctor_id, -- 用COALESCE把NULL转成0,无预约的医生就显示0天 COALESCE(COUNT(DISTINCT DATE(a.appointment_date)), 0) AS monthly_working_days FROM doctors d LEFT JOIN appointments a ON d.doctor_id = a.doctor_id -- 把日期筛选条件放在JOIN里,避免左连接变成内连接 AND EXTRACT(YEAR FROM a.appointment_date) = 2024 AND EXTRACT(MONTH FROM a.appointment_date) = 12 GROUP BY d.doctor_id;
数据库专属简化写法
不同数据库有更简洁的日期函数,比如:
- MySQL可以直接用
YEAR()和MONTH():WHERE YEAR(appointment_date) = 2024 AND MONTH(appointment_date) = 12 - SQL Server用
DATEPART():WHERE DATEPART(YEAR, appointment_date) = 2024 AND DATEPART(MONTH, appointment_date) = 12
小提醒:
如果需要动态统计当前年度的12月,可以把固定年份换成YEAR(CURRENT_DATE)(MySQL/PostgreSQL)或者DATEPART(YEAR, GETDATE())(SQL Server),这样不用每年修改SQL。
内容的提问来源于stack exchange,提问作者user1591668
相关产品推荐
相关产品推荐

