ข้อมูลผู้ป่วยใน Admit ภายใน 48 ชม. แยก ward

จำนวนคน

SET @start_date = '2024-10-01';
SET @end_date = '2024-10-31';
 
SELECT
i.ward,
w.NAME AS ward_name,
DATE_FORMAT(i.regdate, '%Y-%m') AS admit_month,
 
-- 1. [เปลี่ยน] นับจำนวนผู้ป่วย (HN) ที่ LOS <= 48 ชม.
COUNT(DISTINCT CASE
WHEN TIMESTAMPDIFF(
HOUR,
CONCAT(i.regdate, ' ', i.regtime),
CONCAT(i.dchdate, ' ', i.dchtime)
) <= 48 THEN i.hn -- เปลี่ยนจาก i.an เป็น i.hn
ELSE NULL
END) AS total_patients_lte_48h,
 
-- 2. [เปลี่ยน] นับจำนวนผู้ป่วย (HN) ที่ LOS > 48 ชม.
COUNT(DISTINCT CASE
WHEN TIMESTAMPDIFF(
HOUR,
CONCAT(i.regdate, ' ', i.regtime),
CONCAT(i.dchdate, ' ', i.dchtime)
) > 48 THEN i.hn -- เปลี่ยนจาก i.an เป็น i.hn
ELSE NULL
END) AS total_patients_gt_48h,
 
-- 3. คำนวณวันนอน (ตามกฎ 6 ชม.) ของกลุ่ม <= 48 ชม.
SUM(
CASE
WHEN TIMESTAMPDIFF(
HOUR,
CONCAT(i.regdate, ' ', i.regtime),
CONCAT(i.dchdate, ' ', i.dchtime)
) <= 48 THEN
CASE
WHEN DATEDIFF(i.dchdate, i.regdate) = 0 THEN
CASE
WHEN TIMESTAMPDIFF(
HOUR,
CONCAT(i.regdate, ' ', i.regtime),
CONCAT(i.dchdate, ' ', i.dchtime)
) > 6 THEN 1
ELSE 0
END
ELSE DATEDIFF(i.dchdate, i.regdate)
END
ELSE 0
END
) AS total_los_days_lte_48h,
 
-- 4. คำนวณวันนอน (ตามกฎ 6 ชม.) ของกลุ่ม > 48 ชม.
SUM(
CASE
WHEN TIMESTAMPDIFF(
HOUR,
CONCAT(i.regdate, ' ', i.regtime),
CONCAT(i.dchdate, ' ', i.dchtime)
) > 48 THEN
CASE
WHEN DATEDIFF(i.dchdate, i.regdate) = 0 THEN
CASE
WHEN TIMESTAMPDIFF(
HOUR,
CONCAT(i.regdate, ' ', i.regtime),
CONCAT(i.dchdate, ' ', i.dchtime)
) > 6 THEN 1
ELSE 0
END
ELSE DATEDIFF(i.dchdate, i.regdate)
END
ELSE 0
END
) AS total_los_days_gt_48h,
 
-- 5. นับจำนวน HN ที่ไม่ซ้ำกันทั้งหมด (จำนวนผู้ป่วย)
COUNT(DISTINCT i.hn) AS total_unique_patients
 
FROM
ipt i
LEFT JOIN ward w ON i.ward = w.ward
WHERE
i.dchdate IS NOT NULL
AND i.regdate BETWEEN @start_date AND @end_date
GROUP BY
i.ward,
w.NAME,
admit_month
ORDER BY
i.ward,
admit_month;

จำนวนครั้ง

SET @start_date = '2024-10-01';
SET @end_date = '2024-10-31';
 
SELECT
i.ward,
w.NAME AS ward_name,
DATE_FORMAT(i.regdate, '%Y-%m') AS admit_month,
 
-- 1. นับจำนวน visit (AN) ที่ LOS <= 48 ชม.
COUNT(DISTINCT CASE
WHEN TIMESTAMPDIFF(
HOUR,
CONCAT(i.regdate, ' ', i.regtime),
CONCAT(i.dchdate, ' ', i.dchtime)
) <= 48 THEN i.an
ELSE NULL
END) AS total_visits_lte_48h,
 
-- 2. นับจำนวน visit (AN) ที่ LOS > 48 ชม.
COUNT(DISTINCT CASE
WHEN TIMESTAMPDIFF(
HOUR,
CONCAT(i.regdate, ' ', i.regtime),
CONCAT(i.dchdate, ' ', i.dchtime)
) > 48 THEN i.an
ELSE NULL
END) AS total_visits_gt_48h,
 
-- 3. คำนวณวันนอน (ตามกฎ 6 ชม.) ของกลุ่ม <= 48 ชม.
SUM(
CASE
-- เงื่อนไขคือ ต้องเป็นเคส <= 48 ชม. เท่านั้น
WHEN TIMESTAMPDIFF(
HOUR,
CONCAT(i.regdate, ' ', i.regtime),
CONCAT(i.dchdate, ' ', i.dchtime)
) <= 48 THEN
-- Logic การคำนวณวันนอน (6 ชม. = 1 วัน)
CASE
WHEN DATEDIFF(i.dchdate, i.regdate) = 0 THEN -- D/C วันเดียวกับ Admit
CASE
WHEN TIMESTAMPDIFF(
HOUR,
CONCAT(i.regdate, ' ', i.regtime),
CONCAT(i.dchdate, ' ', i.dchtime)
) > 6 THEN 1
ELSE 0
END
ELSE DATEDIFF(i.dchdate, i.regdate) -- D/C คนละวัน
END
ELSE 0 -- ไม่เข้าเงื่อนไข 48 ชม. ให้นับเป็น 0
END
) AS total_los_days_lte_48h,
 
-- 4. คำนวณวันนอน (ตามกฎ 6 ชม.) ของกลุ่ม > 48 ชม.
SUM(
CASE
-- เงื่อนไขคือ ต้องเป็นเคส > 48 ชม. เท่านั้น
WHEN TIMESTAMPDIFF(
HOUR,
CONCAT(i.regdate, ' ', i.regtime),
CONCAT(i.dchdate, ' ', i.dchtime)
) > 48 THEN
-- Logic การคำนวณวันนอน (6 ชม. = 1 วัน)
CASE
WHEN DATEDIFF(i.dchdate, i.regdate) = 0 THEN -- D/C วันเดียวกับ Admit
CASE
WHEN TIMESTAMPDIFF(
HOUR,
CONCAT(i.regdate, ' ', i.regtime),
CONCAT(i.dchdate, ' ', i.dchtime)
) > 6 THEN 1
ELSE 0
END
ELSE DATEDIFF(i.dchdate, i.regdate) -- D/C คนละวัน
END
ELSE 0 -- ไม่เข้าเงื่อนไข > 48 ชม. ให้นับเป็น 0
END
) AS total_los_days_gt_48h,
 
-- 5. [ที่เปลี่ยน] นับจำนวน AN ที่ไม่ซ้ำกันทั้งหมด (จำนวนการ Admit)
COUNT(DISTINCT i.an) AS total_all_visits
 
FROM
ipt i
LEFT JOIN ward w ON i.ward = w.ward
WHERE
i.dchdate IS NOT NULL
AND i.regdate BETWEEN @start_date AND @end_date
GROUP BY
i.ward,
w.NAME,
admit_month
ORDER BY
i.ward,
admit_month;