มาเล่าให้ฟังต่อครับ
แนวคิดในการเขียน sql ของผมก็คือ
(เอาเรื่องผู้ป่วย HIV มา ร.พ.มากกว่า 1 ครั้ง และอายุมากกว่า 15 ปีก่อนนะครับ)
อันดับแรกก็คือดึงรายการผู้ป่วยที่มี diag ตามที่ต้องการก่อน โดยใช้ ovstdiag ตามช่วงเวลาที่กำหนด
ก็จะได้ sql ประมาณนี้
select p.hn,concat(p.pname,p.fname," ",p.lname) as ptname,p.sex,v.age_y,p.birthday,count(v.vn) as times
from vn_stat v
join ovstdiag od on od.vn=v.vn
join patient p on p.hn=v.hn
where ((od.icd10 between "B20" and "B24") or od.icd10 like "Z21" or od.icd10 like "R75") and (v.vstdate between "'+ds1+'" and "'+ds2+'") and v.age_y > 15
group by hn
order by p.hn,v.vn
ก็จะได้ว่าผู้ป่วยที่ต้องกามา ร.พ.กี่ครั้งในช่วงเวลาที่กำหนด
ต่อมาเราก็มาเลือกเอาเฉพาะรายที่มีจำนวนครั้งของการมา (times) มากกว่า 1 ก็ต้องเป็นอีก sql หนึ่งซ้อนอยู่ข้างนอกพร้อมเงื่อนไข
select hn,ptname,sex,age_y,birthday,times from [sqlเดิม] where times > 1
โดยที่ [sqlเดิม] คือ sql จากข้างบนใช่ไหมครับ
ดังนั้น sql ที่สมบูรณ์ของผมก็จะเป็นแบบนี้ครับ
select hn,ptname,sex,age_y,birthday,times from (
select p.hn,concat(p.pname,p.fname," ",p.lname) as ptname,p.sex,v.age_y,p.birthday,count(v.vn) as times
from vn_stat v
join ovstdiag od on od.vn=v.vn
join patient p on p.hn=v.hn
where ((od.icd10 between "B20" and "B24") or od.icd10 like "Z21" or od.icd10 like "R75") and (v.vstdate between "'+ds1+'" and "'+ds2+'") and v.age_y > 15
group by hn
order by p.hn,v.vn)
as tempwhere times > 1');
คราวนี้คงงงว่า as temp มาจากไหน ก็เพือให้ sql ในส่วนสีแดงมีที่อยู่ก็เลยต้องอ่านขอ้มูลไปเก็บใน temp ก่อนไงครับ
อันนี้แบบเบาะ ๆ DuplicateCID_Patient ยากกว่านี้อีกหน่อยหนึ่ง
ใครเขียนสั้น ๆ อย่าว่ากันนะครับ
ผมไล่ทีละ step ว่าจะได้อะไรออกมาบ้าง แล้วจึงนำมารวมกัน
ลองไปแกะ sql ของ DuplicateCID_Patient นะครับ
ปล.ไม่ใช่เทพ