ผู้เขียน หัวข้อ: SQL Advance  (อ่าน 7884 ครั้ง)

0 สมาชิก และ 1 บุคคลทั่วไป กำลังดูหัวข้อนี้

ออฟไลน์ onlinelp

  • Full Member
  • ***
  • กระทู้: 163
  • Respect: 0
    • ดูรายละเอียด
    • โรงพยาบาลพระนารายณ์มหาราช
SQL Advance
« เมื่อ: พฤษภาคม 04, 2010, 19:48:17 PM »
0
เรียนถามท่านทั้งหลาย ที่ใช้ 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)
โรงพยาบาลพระนารายณ์มหาราช จ.ลพบุรี
HOSxp Version : 3.53.12.8
สำรวย  ช้างจวง (ต๊อก)
MSN : aminoaul@hotmail.com
------------------------------------------------------------------------
KSK Kill >>sality.a  http://www.webphand.com/sality/fix.php

ออฟไลน์ Svl2Nuk3

  • Hero Member
  • *****
  • กระทู้: 793
  • Respect: 0
    • ดูรายละเอียด
Re: SQL Advance
« ตอบกลับ #1 เมื่อ: พฤษภาคม 04, 2010, 20:18:08 PM »
0
เดี๋ยวถ้ามีเวลาจะมาช่วยดูอีกทีครับ

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

I'm nuke (นุ๊ก)
My Blog  : http://www.codenuke.net
อดีต นวก.คอมฯ รพช.พรหมพิราม => 1 พ.ค. 52 - 30 ก.ย. 54
ปัจจุบัน : Software Engineer บริษัทแห่งหนึ่ง

ออฟไลน์ onlinelp

  • Full Member
  • ***
  • กระทู้: 163
  • Respect: 0
    • ดูรายละเอียด
    • โรงพยาบาลพระนารายณ์มหาราช
Re: SQL Advance
« ตอบกลับ #2 เมื่อ: พฤษภาคม 04, 2010, 21:48:34 PM »
0
เดี๋ยวถ้ามีเวลาจะมาช่วยดูอีกทีครับ

แต่คร่าว ๆ  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 ....  ปิดท้าย แห่ะขอโทษครับ
พอดีตอนนี้อยุ่ที่บ้านแล้วไม่มีไรติดตัวเลย เขียนสด
โรงพยาบาลพระนารายณ์มหาราช จ.ลพบุรี
HOSxp Version : 3.53.12.8
สำรวย  ช้างจวง (ต๊อก)
MSN : aminoaul@hotmail.com
------------------------------------------------------------------------
KSK Kill >>sality.a  http://www.webphand.com/sality/fix.php

ออฟไลน์ bmsKeang-Sonata

  • Jr. Member
  • **
  • กระทู้: 75
  • Respect: 0
    • ดูรายละเอียด
Re: SQL Advance
« ตอบกลับ #3 เมื่อ: พฤษภาคม 05, 2010, 08:47:11 AM »
0
ขอเขียนสด ตอบเหมือนกันนะคะ

         จากตาราง 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
 

ออฟไลน์ Svl2Nuk3

  • Hero Member
  • *****
  • กระทู้: 793
  • Respect: 0
    • ดูรายละเอียด
Re: SQL Advance
« ตอบกลับ #4 เมื่อ: พฤษภาคม 05, 2010, 10:21:24 AM »
0
^
^
^

ตามข้างบนเลยครับ   ;D   แต่ถ้าจะเอาชื่อโรคก็เพิ่ม i.name เข้าไปครับ
I'm nuke (นุ๊ก)
My Blog  : http://www.codenuke.net
อดีต นวก.คอมฯ รพช.พรหมพิราม => 1 พ.ค. 52 - 30 ก.ย. 54
ปัจจุบัน : Software Engineer บริษัทแห่งหนึ่ง

ออฟไลน์ bmsKeang-Sonata

  • Jr. Member
  • **
  • กระทู้: 75
  • Respect: 0
    • ดูรายละเอียด
Re: SQL Advance
« ตอบกลับ #5 เมื่อ: พฤษภาคม 05, 2010, 13:05:07 PM »
0
    ถูกต้องนะคร๊าบ คุณ Imnuke อิอิ ;D ;D
 

ออฟไลน์ onlinelp

  • Full Member
  • ***
  • กระทู้: 163
  • Respect: 0
    • ดูรายละเอียด
    • โรงพยาบาลพระนารายณ์มหาราช
Re: SQL Advance
« ตอบกลับ #6 เมื่อ: พฤษภาคม 05, 2010, 21:00:31 PM »
0
ขอบคุณทุกๆท่านครับ

งั้นสรุปว่าที่ผมเขียนนี้ก็ใช้ได้ใช่มัยครับ
แต่ขึ้นอยุ่กับว่าใช้ในกรณีไหน :-* :-*
โรงพยาบาลพระนารายณ์มหาราช จ.ลพบุรี
HOSxp Version : 3.53.12.8
สำรวย  ช้างจวง (ต๊อก)
MSN : aminoaul@hotmail.com
------------------------------------------------------------------------
KSK Kill >>sality.a  http://www.webphand.com/sality/fix.php