query ไม่มาตามนัด

query ncd พี่เอ็ง

SET @startdate = '2025-01-01';
SET @enddate = CURDATE();
-- ถ้าต้องการเลือกเฉพาะบางห้องตรวจ ใส่ depcode ตรงนี้
SET @depcode := '063';
-- เว้นว่าง = ทุกห้อง / เช่น '001' = ห้องตรวจอายุรกรรม
SELECT
a.oapp_id,
a.hn,
CONCAT(
p.pname,
' ',
p.fname,
' ',
p.lname
) AS pt_name,
kd.department AS clinic,
-- ห้องตรวจ/คลินิก
a.nextdate AS appoint_date,
-- วันที่มาล่วงหน้าในช่วง 1–14 วันก่อนวันนัด
(
SELECT
MAX(o2.vstdate)
FROM
ovst o2
WHERE
o2.hn = a.hn
AND o2.vstdate BETWEEN DATE_SUB(a.nextdate, INTERVAL 14 DAY)
AND DATE_SUB(a.nextdate, INTERVAL 1 DAY)
) AS early_visit_date,
CASE
WHEN (
SELECT
COUNT(*)
FROM
ovst o2
WHERE
o2.hn = a.hn
AND o2.vstdate BETWEEN DATE_SUB(a.nextdate, INTERVAL 14 DAY)
AND DATE_SUB(a.nextdate, INTERVAL 1 DAY)
) > 0 THEN
'came_early_within_14d'
ELSE
'no_show'
END AS status_flag,
d. NAME AS doctor_name
FROM
oapp a
JOIN patient p ON p.hn = a.hn
LEFT JOIN kskdepartment kd ON kd.depcode = a.depcode
LEFT JOIN doctor d ON d. CODE = a.doctor
WHERE
a.nextdate BETWEEN @startdate
AND @enddate -- ถ้า @depcode มีค่า → เลือกเฉพาะห้องนั้น
AND (
@depcode = ''
OR a.depcode = @depcode
) -- กรองไม่มาตามนัดจริง ๆ
AND NOT EXISTS (
SELECT
1
FROM
ovst o3
WHERE
o3.hn = a.hn
AND o3.vstdate = a.nextdate
)
ORDER BY
a.nextdate,
a.hn;