BMS-HOSxP Community

HOSxP => แจ้งปัญหา / ขอความช่วยเหลือ => ข้อความที่เริ่มโดย: phatipan2 ที่ กรกฎาคม 13, 2010, 10:40:24 AM

หัวข้อ: ขอคำสั่ง SQL ครับ
เริ่มหัวข้อโดย: phatipan2 ที่ กรกฎาคม 13, 2010, 10:40:24 AM
      พอดีต้องทำรายงาน ครับ แต่ไม่ทราบว่าจะใช้คำสั่ง SQL อย่างไรดี ครับ
คือ  1.ต้องการทราบจำนวนผู้ป่วยทั้งหมดที่เป็น โรคเบาหวานและเป็นความดันด้วยครับ
       2.ต้องการทราบว่ามีผู้ป่วย ที่เป็นเบาหวานและเป็นความดันที่เป็นรายใหม่กี่ราย ครับ ในช่วง 1ต.ค.52-30 ก.ย.53
       3.ต้องการทราบว่ามีผู้ป่วย ที่เป็นเบาหวานและเป็นความดันที่เป็นรายเก่ากี่ราย ครับ ในช่วง 1ต.ค.52-30 ก.ย.53

ขอรบกวนอาจารย์ทุกท่านด้วย ครับ
   
หัวข้อ: Re: ขอคำสั่ง SQL ครับ
เริ่มหัวข้อโดย: howtodo ที่ กรกฎาคม 13, 2010, 10:42:51 AM
ลงทะเบียนผู้ป่วยเรื้อรัง  หรือเปล่า
หัวข้อ: Re: ขอคำสั่ง SQL ครับ
เริ่มหัวข้อโดย: phatipan2 ที่ กรกฎาคม 13, 2010, 10:55:08 AM
พอดีไม่ได้ลง ครับ งานเข้าเลย ครับ
หัวข้อ: Re: ขอคำสั่ง SQL ครับ
เริ่มหัวข้อโดย: panomm ที่ กรกฎาคม 13, 2010, 11:52:08 AM
ลองดูที่ เมนู รายงาน >>> costom search ดูก่อนครับ
หัวข้อ: Re: ขอคำสั่ง SQL ครับ
เริ่มหัวข้อโดย: phatipan2 ที่ กรกฎาคม 13, 2010, 17:06:31 PM
ลองดูแล้ว ครับ แต่ว่า อยากทราบ ผู้ป่วยที่เป็นทั้ง HT และ DM ทั้ง 2 โรค ครับ  custom ทำได้ไหม ครับ
หัวข้อ: Re: ขอคำสั่ง SQL ครับ
เริ่มหัวข้อโดย: udomchok ที่ กรกฎาคม 13, 2010, 18:14:32 PM
select hn, count(vn) from
(select o1.vn,o1.hn,o1.vstdate,o2.icd10
from ovst o1
join ovstdiag o2 on o2.vn=o1.vn
where (o1.vstdate between "2010-01-01" and "2010-01-31") and ((o2.icd10 between "E10" and "E14") or (o2.icd10="I10"))) as temp
group by vn
having count(vn) = 2

อธิบาย
เริ่มจาก
select o1.vn,o1.hn,o1.vstdate,o2.icd10
from ovst o1
join ovstdiag o2 on o2.vn=o1.vn
where (o1.vstdate between "2010-01-01" and "2010-01-31") and ((o2.icd10 between "E10" and "E14") or (o2.icd10="I10"))
หมายถึง การดึงข้อมูลการวินิจฉัยโรคจากตาราง ovstdiag ของผู้รับบริการระหว่างวันที่ 1/1/2010 ถึง 31/1/2010 และมีวินิจฉัยเป็น E10-E14 หรือ I10
เมื่อ run เฉพาะช่วงนี้ก็จะได้คนที่มีวินิจฉัยดังนี้
1. เบาหวาน อย่างเดียว
2. ความดัน อย่างเดียว
3. เบาหวานและความดันทั้ง 2 โรค
แต่โจทย์ต้องการเฉพาะคนที่เป็น 2 โรค
จึงต้อง select ใหม่ จาก Data ที่ได้ใน SQL ข้างต้น โดยเพิ่มเงื่อนไขว่าต้องมี VN 2 VN
โดยใช้ select อันใหม่คร่อม SQL เดิม และเพิ่ม having vn = 2 เข้าไป
จึงได้ sql ที่สมบูรณ์ดังตัวอย่าง
หัวข้อ: Re: ขอคำสั่ง SQL ครับ
เริ่มหัวข้อโดย: udomchok ที่ กรกฎาคม 13, 2010, 18:22:15 PM
ปัญหาที่พบจาก SQL ข้างต้น จะพบกรณีที่มีการมาตรวจมากกว่า 1 ครั้งในช่วงเวลาที่กำหนด จะได้ข้อมูลผิดพลาด คือมี HN ซ้ำ เช่น เลือกดูข้อมูลมากกว่า 1 เดือน หรือผู้ป่วยมาตรวจใน 4 สัปดาห์ แต่เราเลือกดูข้อมูล 1 เดือน

จึงต้องแก้เป็น

select t2.hn from
(select t1.hn, count(t1.vn) as times from
(select o1.vn,o1.hn,o1.vstdate,o2.icd10
from ovst o1
join ovstdiag o2 on o2.vn=o1.vn
where (o1.vstdate between "2010-01-01" and "2010-01-31") and ((o2.icd10 between "E10" and "E14") or (o2.icd10="I10"))) as t1
group by t1.vn
having count(t1.vn) = 2) as t2
group by t2.hn
หัวข้อ: Re: ขอคำสั่ง SQL ครับ
เริ่มหัวข้อโดย: udomchok ที่ กรกฎาคม 13, 2010, 18:27:45 PM
จากคำตอบทั้ง 2 นั้น สามารถเขียนให้สั้นได้โดยอ้างอิงเฉพาะตาราง ovstdiag ก็ได้ เพราะ hn,vn,vstdate ที่เราต้องใช้ มีอยู่ใน ovstdiag แล้ว
แต่ผมพบว่าข้อมูลของผมบาง record ใน ovstdiag มี vstdate เป็น 01/01/2443 ซึ่งก็คือไม่มีค่านั่นเอง ทำให้ดึงข้อมูลออกมาไม่ครบ ... อันนี้ไม่ทราบว่าเป็นเพราะอะไร vstdate จาก ovst จึงไม่ไป update ใน ovstdiag (เดี๋ยวต้องสั่งเองซะแล้ว... :D :D :D :D )

แต่ถ้าข้อมูล vstdate ใน ovstdiag ไม่มีปัญหา เราสามารถเขียน sql ให้สั้นลงได้
select t2.hn from
(select t1.hn, count(t1.vn) as times from
(select o2.vn,o2.hn,o2.vstdate,o2.icd10
from ovstdiag o2
where (o2.vstdate between "2010-01-01" and "2010-01-31") and ((o2.icd10 between "E10" and "E14") or (o2.icd10="I10"))) as t1
group by t1.vn
having count(t1.vn) = 2) as t2
group by t2.hn

สั้นลงไปอีกนิด คือไม่ต้องไป join กับ ovst เท่านั้นเอง
หัวข้อ: Re: ขอคำสั่ง SQL ครับ
เริ่มหัวข้อโดย: udomchok ที่ กรกฎาคม 13, 2010, 18:53:25 PM
ปัญหาที่เจอในข้อมูลของ ovstdiag คือ มีบาง vn ที่มี vstdate น้อยกว่า vstdate ของ ovst ซึ่งไม่น่าจะเป็นไปได้ เพราะการ diag ไม่เกิดก่อนการมี visit ตอนนี้ยังหาสาเหตุไม่ได้ :(

อีกบางส่วน ovstdiag.vstdate > ovst.vstdate ซึ่งอาจจะเป็นไปได้ว่ามีลง diag ทีหลัง คือหลังจากวันที่มาตรวจ (เกิด visit)....อันนี้รอพิสูจน์ก่อนนะ

สรุปว่าให้ใช้ SQL ตามนี้ safe และ sure สุดครับ
select t2.hn from
(select t1.hn, count(t1.vn) as times from
(select o1.vn,o1.hn,o1.vstdate,o2.icd10
from ovst o1
join ovstdiag o2 on o2.vn=o1.vn
where (o1.vstdate between "2010-01-01" and "2010-01-31") and ((o2.icd10 between "E10" and "E14") or (o2.icd10="I10"))) as t1
group by t1.vn
having count(t1.vn) = 2) as t2
group by t2.hn
หัวข้อ: Re: ขอคำสั่ง SQL ครับ
เริ่มหัวข้อโดย: udomchok ที่ กรกฎาคม 13, 2010, 18:58:32 PM
       2.ต้องการทราบว่ามีผู้ป่วย ที่เป็นเบาหวานและเป็นความดันที่เป็นรายใหม่กี่ราย ครับ ในช่วง 1ต.ค.52-30 ก.ย.53
       3.ต้องการทราบว่ามีผู้ป่วย ที่เป็นเบาหวานและเป็นความดันที่เป็นรายเก่ากี่ราย ครับ ในช่วง 1ต.ค.52-30 ก.ย.53   
ข้อ 2 และข้อ 3 ไม่สามารถบอกได้ หากไม่ขึ้นทะเบียนผู้ป่วยเหล่านี้ (ลงข้อมูลใน clinic พิเศษ)
เพราะในหน้าจอคลินิกพิเศษจะมีปีที่เริ่มป่วย เราสามารถดึงตรงนี้มาได้ครับ หากคำว่า "เป็นรายใหม่" หมายถึง เพิ่มเริ่มป่วย
แต่ถ้า "เป็นรายใหม่" หมายถึง เพิ่งมารับการรักษาที่เรา (เก่าที่อื่น...ใหม่ที่เรา) ก็ต้องไปดูที่ registry date

สรุปว่ายังไงก็ต้องลงทะเบียนเข้า clinic พิเศษก่อนครับ
หัวข้อ: Re: ขอคำสั่ง SQL ครับ
เริ่มหัวข้อโดย: udomchok ที่ กรกฎาคม 13, 2010, 19:01:10 PM
หากนำความรู้ที่ได้จากกระทู้นี้ http://hosxp.net/index.php?option=com_smf&Itemid=28&topic=16251.msg131717 มาช่วย

ก็จะได้เป็นแบบนี้ครับ
select distinct(t1.hn), count(t1.vn) as times from
(select o1.vn,o1.hn,o1.vstdate,o2.icd10
from ovst o1
join ovstdiag o2 on o2.vn=o1.vn
where (o1.vstdate between "2010-01-01" and "2010-01-31") and ((o2.icd10 between "E10" and "E14") or (o2.icd10="I10"))) as t1
group by t1.vn
having count(t1.vn) = 2

ผมก็ลืมไปซะสนิทเลย  ;D ;D ;D ;D ;D
หัวข้อ: Re: ขอคำสั่ง SQL ครับ
เริ่มหัวข้อโดย: wiphusit ที่ กุมภาพันธ์ 22, 2011, 16:52:47 PM
หากนำความรู้ที่ได้จากกระทู้นี้ http://hosxp.net/index.php?option=com_smf&Itemid=28&topic=16251.msg131717 มาช่วย

ก็จะได้เป็นแบบนี้ครับ
select distinct(t1.hn), count(t1.vn) as times from
(select o1.vn,o1.hn,o1.vstdate,o2.icd10
from ovst o1
join ovstdiag o2 on o2.vn=o1.vn
where (o1.vstdate between "2010-01-01" and "2010-01-31") and ((o2.icd10 between "E10" and "E14") or (o2.icd10="I10"))) as t1
group by t1.vn
having count(t1.vn) = 2

ผมก็ลืมไปซะสนิทเลย  ;D ;D ;D ;D ;D
แล้วถ้าต้องการนับจำนวนละครับ