-- รายงานค่ารักษาพยาบาลผู้ป่วยนอก ออกรายงาน ตามวันที่เข้ารับบริการ
SELECT t_patient.patient_hn as HN
, t_visit.visit_vn as VN
, t_patient.patient_pid as ปชช
, f_patient_prefix.patient_prefix_description AS คำนำหน้า
, t_patient.patient_firstname AS ชื่อ
, t_patient.patient_lastname AS นามสกุล
, t_patient.patient_birthday as วันเกิด
, t_visit.visit_patient_age AS อายุ
, f_patient_race_id as เชื้อชาติ
, f_patient_nation_id As สัญชาติ
, substr(visit_begin_visit_time,1,10 ) as วันที่เข้ารับบริการ
, substr( visit_staff_doctor_discharge_date_time,1,10) as วันที่จำหน่าย
---จะ count สิทธิการรักษา
, contract_plans_description AS สิทธิการรักษา
, t_visit_payment.visit_payment_main_hospital as ประจำ
, t_visit_payment.visit_payment_sub_hospital as ปฐมภูมิ
, t_diag_icd10.diag_icd10_number as รหัสโรค
, ค่าห้อง_อาหาร
, อวัยวะเทียม
, ยาและสารอาหาร
, ยากลับบ้าน
, เวชภัณฑ์
, บริการโลหิต
, วินิจฉัยทางเทคนิค
, วินิจฉัยและรังสีวิทยา
, วินิจฉัยวิธีพิเศษ
, อุปกรณ์
, ผ่าตัด_หัตถการ
, พยาบาล
, ทันตกรรม
, กายภาพบำบัด
, ฝังเข็ม
, อื่น
, Total
, Paid
, Remain
FROM b_contract_plans
INNER JOIN ((((
(
SELECT Insurance1.t_visit_id
, Sum(case when Gr16='1' then N end) AS ค่าห้อง_อาหาร
, Sum(case when Gr16='2' then N end) AS อวัยวะเทียม
, Sum(case when Gr16='3' then N end) AS ยาและสารอาหาร
, Sum(case when Gr16='4_OH' then N end) AS ยากลับบ้าน
, Sum(case when Gr16='5' then N end) AS เวชภัณฑ์
, Sum(case when Gr16='6' then N end) AS บริการโลหิต
, Sum(case when Gr16='7' then N end) AS วินิจฉัยทางเทคนิค
, Sum(case when Gr16='8' then N end) AS วินิจฉัยและรังสีวิทยา
, Sum(case when Gr16='9' then N end) AS วินิจฉัยวิธีพิเศษ
, Sum(case when Gr16='A' then N end) AS อุปกรณ์
, Sum(case when Gr16='B' then N end) AS ผ่าตัด_หัตถการ
, Sum(case when Gr16='C' then N end) AS พยาบาล
, Sum(case when Gr16='D' then N end) AS ทันตกรรม
, Sum(case when Gr16='E' then N end) AS กายภาพบำบัด
, Sum(case when Gr16='F' then N end) AS ฝังเข็ม
, Sum(case when Gr16='G' then N end) AS อื่น
FROM
(
SELECT t_billing_invoice_item.t_visit_id
, b_item_16_group.item_16_group_number AS Gr16
, Sum(t_billing_invoice_item.billing_invoice_item_total) AS N
FROM (b_item_16_group
INNER JOIN b_item
ON b_item_16_group.b_item_16_group_id = b_item.b_item_16_group_id)
INNER JOIN t_billing_invoice_item
ON b_item.b_item_id = t_billing_invoice_item.b_item_id
WHERE (((t_billing_invoice_item.billing_invoice_item_active)='1'))
GROUP BY t_billing_invoice_item.t_visit_id, b_item_16_group.item_16_group_number
ORDER BY t_billing_invoice_item.t_visit_id,Gr16
) as Insurance1
GROUP BY Insurance1.t_visit_id
order by t_visit_id
) as Insurance2
INNER JOIN (f_patient_prefix
RIGHT JOIN (t_patient
INNER JOIN t_visit
ON t_patient.t_patient_id = t_visit.t_patient_id)
ON f_patient_prefix.f_patient_prefix_id = t_patient.f_patient_prefix_id)
ON Insurance2.t_visit_id = t_visit.t_visit_id)
INNER JOIN t_diag_icd10
ON t_visit.t_visit_id = t_diag_icd10.diag_icd10_vn)
INNER JOIN
( select t_visit_id
,sum(billing_total) as Total
,sum(billing_paid) as Paid
,sum(billing_remain) as Remain
from t_billing
where billing_active='1'
group by t_visit_id
order by t_visit_id
)as t_billing1
ON t_visit.t_visit_id = t_billing1.t_visit_id)
INNER JOIN t_visit_payment
ON t_visit.t_visit_id = t_visit_payment.t_visit_id)
ON b_contract_plans.b_contract_plans_id = t_visit_payment.b_contract_plans_id
WHERE (((t_visit.f_visit_status_id)<>'4')
AND ((t_visit_payment.visit_payment_active)='1')
and ((t_diag_icd10.diag_icd10_active)='1')
and ((t_diag_icd10.f_diag_icd10_type_id)='1'))
and (substr(visit_begin_visit_time,1,10) between substr(?,1,10) and substr(?,1,10))
and f_visit_type_id ='0'
order by t_visit.visit_begin_visit_time
ลักษณะตารางนี่มันของ hospital os ใช่มั้ยครับ เดี๋ยวถ้ามีเวลาจะช่วยดูให้นะครับ (ตอนนี้ไม่ได้ใช้ Hospital OS แล้ว)
แต่ concept ก็คือ SELECT ข้อมูลทั้งหมดออกมาให้ได้ก่อนครับ ไม่ว่าจะ Joint กันกี่ตารางก็ตาม
หลังจาก SELECT ได้ครบตามเงื่อนไขแล้ว ค่อยนำมา GROUP BY ตามสิ่งที่ต้องการ
พร้อมทั้งใช้ ฟังก์ชั่น COUNT ไปด้วย (คิดว่าน่าจะใช้ PostgreSQL ด้วยใช่มั้ยครับ)
แต่ระวังเรื่อง data type โดยเฉพาะความกว้างของ Field ด้วยนะครับ เพราะตอนที่ผมใช้อยู่มันตั้งไว้ 255 ทุกฟิลดิ์เลย
มันเลยทำให้เป็นอุปสรรคในการคิวรี่น่ะครับ