BMS-HOSxP Community
HOSxP => การเขียน SQL Script => ข้อความที่เริ่มโดย: onlinelp ที่ พฤษภาคม 04, 2010, 19:48:17 PM
-
เรียนถามท่านทั้งหลาย ที่ใช้ SQL ดึงข้อมูลเพื่อรายงานผลต่างๆ+รายงานย่อยๆ
ตัวอย่างเช่น 10 อันดับโรค ปี 2552 OPD/IPD
ผมใช้ตาราง vn_stat + ovstdiag + icd101 ในการหาอันดับโรคดังกล่าว
เช่นเดียวกันกับผู้ป่วยใน an_stat + iptdiag + icd101
select odx.icd10,ic.name,count(distinct(ov.hn))as thn,count(ov.hn)as tthn
from vn_stat ov
left outer join ovstdiag odx on odx.vn=ov.vn
left outer join icd101 ic on ic.code=odx.icd10
where ov.vstdate between '2008-10-01' and '2009-09-30'
limit 10
จาก code SQL ดังกล่าว
อยากทราบว่าพอจะมีความเสถียรบ้างมัยครับหรือผมผิดตรงไหน เพราะในการใช้ดึงข้อมูลในครั้งแรกยังไม่มีการแก้ไขข้อมูลไดๆหลังจากที่มีการแก้ไขแล้วดึกข้อมูลอีกครั้งจึงพบว่ามีการเปลี่ยนแปลงอยู่บ้าง
อีกตัวอย่างนะครับ ยอดผู้มารับบริการที่ รพ.
แบ่งเป็น จำนวนคน และ จำนวนครั้ง
select count(distinct(hn)as thn,count(hn)as tthn
from vn_stat
where vstdate between '2008-10-01' and '2009-09-30'
จาก code SQL ดังกล่าว ผมควรจะใช้ ตาราง ovst หรือ vn_stat ดีครับ
ปล.ตามความเข้าใจนะครับ
OPD
ovst = ตารางบันทึกการส่งตรวจ
vn_stat = ตารางบันทึกกิจกรรมห้องตรวจต่างๆ
ovstdiag = ตารางบันทึกผลวินิจฉัยรวมจาก vn_stat (pdx,dx0,dx1,dx2,dx3,dx4,dx5)
IPD
ipt = ตารางบันทึกการรับเข้ารักษาใน รพ.
an_stat = ตารางบันทึกกิจกรรมผู้ป่วยใน
iptdiag = ตารางบันทึกผลวินิจฉัยรวมจาก an_stat (pdx,dx0,dx1,dx2,dx3,dx4,dx5)
-
เดี๋ยวถ้ามีเวลาจะมาช่วยดูอีกทีครับ
แต่คร่าว ๆ vn_stat กับ an_stat เป็นข้อมูลที่สรุปมาไว้ในตารางเดียวครับ
เข้าใจว่าลดความซับซ้อนในการเขียน SQL ดึงข้อมูลได้เยอะมากครับ
-
เดี๋ยวถ้ามีเวลาจะมาช่วยดูอีกทีครับ
แต่คร่าว ๆ vn_stat กับ an_stat เป็นข้อมูลที่สรุปมาไว้ในตารางเดียวครับ
เข้าใจว่าลดความซับซ้อนในการเขียน SQL ดึงข้อมูลได้เยอะมากครับ
ขอบคุณครับ
แต่ผมถึงได้สงสัยว่าจะเขียนแบบไหนถึงจะดีเวลาหา 10 อันดับโรค
ถ้าใช้ vn_stat เพียงตารางเดียวก็ได้นะครับ
select pdx,count(distinct(hn))as thn,count(hn)as tthn
from vn_stat
where vstdate between '2008-10-01' and '2009-09-30'
group by pdx
limit 10
จาก code นี้ผมก็สงสัยอีกนั่นแระ
แล้ว dx0 - 5 เอาไวที่ไหน เพราะ 0-5 ก็มีโรคเหมือนกัน ควรที่จะนับมาด้วย
แล้ว มันจะเป็น 10 อันดับที่แท้จิงหรือ
ปล. code ด้านบนผมคงลืม group by .... ปิดท้าย แห่ะขอโทษครับ
พอดีตอนนี้อยุ่ที่บ้านแล้วไม่มีไรติดตัวเลย เขียนสด
-
ขอเขียนสด ตอบเหมือนกันนะคะ
จากตาราง vn_stat ถ้าต้องการเฉพาะโรคหลักอย่างเดียวก้อควรเอาจากตารางนี้ ก็จะได้ง่ายต่อการเขียน SQL จะได้คำสั่งแบบนี้คะ
select v.pdx, count(distinct(hn)) as con ,count(v.vn) as time from vn_stat v ,icd101 i
where v.pdx=i.code and v.vstdate between "2010-01-01" and "2010-01-31"
group by v.pdx
order by con desc
limit 10
จากตาราง ovstdiag นั้นหมายความว่าต้องการนับทุกโรคคะ โดยนับจาก icd10 จากตารางนี้ให้สังเกตนะคะว่าใน field icd10 จะมีทั้ง icd10 และ icd9 ถ้าต้องการได้เฉพาะ icd10 อย่างเดียว ให้ ทำการเชื่อมตารางจาก 2 ตาราง ด้วยวิธีการ Eqi Join ดังนี้
select v.icd10, count(distinct(hn)) as con ,count(v.icd10) as time from ovstdiag v ,icd101 i
where v.icd10=i.code and v.vstdate between "2010-01-01" and "2010-01-31"
group by v.icd10
order by con desc
limit 10
ไม่แน่ใจว่าต้องการทำแบบไหน เลยทำมาให้ 2 วิธีนะคะ ลองใช้ดูนะคะว่าใช้ได้รึเปล่า
By Training Team
-
^
^
^
ตามข้างบนเลยครับ ;D แต่ถ้าจะเอาชื่อโรคก็เพิ่ม i.name เข้าไปครับ
-
ถูกต้องนะคร๊าบ คุณ Imnuke อิอิ ;D ;D
-
ขอบคุณทุกๆท่านครับ
งั้นสรุปว่าที่ผมเขียนนี้ก็ใช้ได้ใช่มัยครับ
แต่ขึ้นอยุ่กับว่าใช้ในกรณีไหน :-* :-*