BMS-HOSxP Community

HOSxP => การเขียน SQL Script => ข้อความที่เริ่มโดย: onlinelp ที่ พฤษภาคม 04, 2010, 19:48:17 PM

หัวข้อ: SQL Advance
เริ่มหัวข้อโดย: 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)
หัวข้อ: Re: SQL Advance
เริ่มหัวข้อโดย: Svl2Nuk3 ที่ พฤษภาคม 04, 2010, 20:18:08 PM
เดี๋ยวถ้ามีเวลาจะมาช่วยดูอีกทีครับ

แต่คร่าว ๆ  vn_stat  กับ  an_stat  เป็นข้อมูลที่สรุปมาไว้ในตารางเดียวครับ
เข้าใจว่าลดความซับซ้อนในการเขียน SQL ดึงข้อมูลได้เยอะมากครับ

หัวข้อ: Re: SQL Advance
เริ่มหัวข้อโดย: onlinelp ที่ พฤษภาคม 04, 2010, 21:48:34 PM
เดี๋ยวถ้ามีเวลาจะมาช่วยดูอีกทีครับ

แต่คร่าว ๆ  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 ....  ปิดท้าย แห่ะขอโทษครับ
พอดีตอนนี้อยุ่ที่บ้านแล้วไม่มีไรติดตัวเลย เขียนสด
หัวข้อ: Re: SQL Advance
เริ่มหัวข้อโดย: bmsKeang-Sonata ที่ พฤษภาคม 05, 2010, 08:47:11 AM
ขอเขียนสด ตอบเหมือนกันนะคะ

         จากตาราง 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
หัวข้อ: Re: SQL Advance
เริ่มหัวข้อโดย: Svl2Nuk3 ที่ พฤษภาคม 05, 2010, 10:21:24 AM
^
^
^

ตามข้างบนเลยครับ   ;D   แต่ถ้าจะเอาชื่อโรคก็เพิ่ม i.name เข้าไปครับ
หัวข้อ: Re: SQL Advance
เริ่มหัวข้อโดย: bmsKeang-Sonata ที่ พฤษภาคม 05, 2010, 13:05:07 PM
    ถูกต้องนะคร๊าบ คุณ Imnuke อิอิ ;D ;D
หัวข้อ: Re: SQL Advance
เริ่มหัวข้อโดย: onlinelp ที่ พฤษภาคม 05, 2010, 21:00:31 PM
ขอบคุณทุกๆท่านครับ

งั้นสรุปว่าที่ผมเขียนนี้ก็ใช้ได้ใช่มัยครับ
แต่ขึ้นอยุ่กับว่าใช้ในกรณีไหน :-* :-*