ผู้เขียน หัวข้อ: ขอคำสั่ง SQL ครับ  (อ่าน 8317 ครั้ง)

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

ออฟไลน์ phatipan2

  • Full Member
  • ***
  • กระทู้: 245
  • นก ครับ
  • Respect: 0
    • ดูรายละเอียด
    • www.thasaehospital.com
ขอคำสั่ง SQL ครับ
« เมื่อ: กรกฎาคม 13, 2010, 10:40:24 AM »
0
      พอดีต้องทำรายงาน ครับ แต่ไม่ทราบว่าจะใช้คำสั่ง SQL อย่างไรดี ครับ
คือ  1.ต้องการทราบจำนวนผู้ป่วยทั้งหมดที่เป็น โรคเบาหวานและเป็นความดันด้วยครับ
       2.ต้องการทราบว่ามีผู้ป่วย ที่เป็นเบาหวานและเป็นความดันที่เป็นรายใหม่กี่ราย ครับ ในช่วง 1ต.ค.52-30 ก.ย.53
       3.ต้องการทราบว่ามีผู้ป่วย ที่เป็นเบาหวานและเป็นความดันที่เป็นรายเก่ากี่ราย ครับ ในช่วง 1ต.ค.52-30 ก.ย.53

ขอรบกวนอาจารย์ทุกท่านด้วย ครับ
   
โรงพยาบาลท่าแซะ อ.ท่าแซะ จ.ชุมพร
ขี้นระบบ ตุลาคม 2549
Server DELL PowerEdge T410   RAM 8 Gb.
MySQL 5.1.30
OS CentOS 5.4 64bit
HOSxP Version : 3.54.1.5

ออฟไลน์ howtodo

  • Hero Member
  • *****
  • กระทู้: 646
  • Respect: 0
    • ดูรายละเอียด
    • สื่อน้ำท่วม
Re: ขอคำสั่ง SQL ครับ
« ตอบกลับ #1 เมื่อ: กรกฎาคม 13, 2010, 10:42:51 AM »
0
ลงทะเบียนผู้ป่วยเรื้อรัง  หรือเปล่า
ขึ้นระบบ 2549  เข้ามารับช่วงต่อ ต.ค.50 - ส.ค.53 ไม่ครบ 3 ปี ขอบคุณสำหรับความรู้ ความเมตตา ความกรุณา ที่มีให้กับตัวข้าผู้ด้อยปัญญาด้วยดีตลอดมา

ออฟไลน์ phatipan2

  • Full Member
  • ***
  • กระทู้: 245
  • นก ครับ
  • Respect: 0
    • ดูรายละเอียด
    • www.thasaehospital.com
Re: ขอคำสั่ง SQL ครับ
« ตอบกลับ #2 เมื่อ: กรกฎาคม 13, 2010, 10:55:08 AM »
0
พอดีไม่ได้ลง ครับ งานเข้าเลย ครับ
โรงพยาบาลท่าแซะ อ.ท่าแซะ จ.ชุมพร
ขี้นระบบ ตุลาคม 2549
Server DELL PowerEdge T410   RAM 8 Gb.
MySQL 5.1.30
OS CentOS 5.4 64bit
HOSxP Version : 3.54.1.5

ออฟไลน์ panomm

  • Sr. Member
  • ****
  • กระทู้: 378
  • Respect: 0
    • ดูรายละเอียด
Re: ขอคำสั่ง SQL ครับ
« ตอบกลับ #3 เมื่อ: กรกฎาคม 13, 2010, 11:52:08 AM »
0
ลองดูที่ เมนู รายงาน >>> costom search ดูก่อนครับ
Mr.Phanomrung Tiumyos   Song Hospital  Tel 089-4335673   E-Mail panomm@hotmaill.com  >>>>   MSN panomm@hotmail.com 
---------------------------------------------------------------------
Server Xeon  HDD SCSI 2 TB.  Ram 8 GB. Centos 6.4  MySQL Percona-Server-server-55-5.5.33-rel31.1.566.rhel6.x86_64  Hosxp อัพเดท เรื่อยๆ   เริ่ม  1 มิ.ย.  2549 โดย อ.ชัยพร และ คุณไพรัช (คุณบอย) ใช้เต็มระบบ

ออฟไลน์ phatipan2

  • Full Member
  • ***
  • กระทู้: 245
  • นก ครับ
  • Respect: 0
    • ดูรายละเอียด
    • www.thasaehospital.com
Re: ขอคำสั่ง SQL ครับ
« ตอบกลับ #4 เมื่อ: กรกฎาคม 13, 2010, 17:06:31 PM »
0
ลองดูแล้ว ครับ แต่ว่า อยากทราบ ผู้ป่วยที่เป็นทั้ง HT และ DM ทั้ง 2 โรค ครับ  custom ทำได้ไหม ครับ
โรงพยาบาลท่าแซะ อ.ท่าแซะ จ.ชุมพร
ขี้นระบบ ตุลาคม 2549
Server DELL PowerEdge T410   RAM 8 Gb.
MySQL 5.1.30
OS CentOS 5.4 64bit
HOSxP Version : 3.54.1.5

ออฟไลน์ udomchok

  • Hero Member
  • *****
  • กระทู้: 8,347
  • Respect: +589
    • ดูรายละเอียด
    • ร.พ.สมเด็จพระสังฆราช องค์ที่ 17
Re: ขอคำสั่ง SQL ครับ
« ตอบกลับ #5 เมื่อ: กรกฎาคม 13, 2010, 18:14:32 PM »
0
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 ที่สมบูรณ์ดังตัวอย่าง
ทำด้วยหัวใจร.พ.สมเด็จพระสังฆราช องค์ที่ 17 อ.สองพี่น้อง จ.สุพรรณบุรี
อบรมโดย BMS Team เมื่อ พ.ย. 49 ขึ้นระบบห้องบัตรเมื่อ X'Mas 2007
2008 : X-Ray กายภาพบำบัด แพทย์แผนไทย กิจกรรมบำบัด OPD ตา
2009 : ทันตกรรม ห้องตรวจตา OPD (พยาบาลและห้องตรวจแพทย์บางห้อง)

ออฟไลน์ udomchok

  • Hero Member
  • *****
  • กระทู้: 8,347
  • Respect: +589
    • ดูรายละเอียด
    • ร.พ.สมเด็จพระสังฆราช องค์ที่ 17
Re: ขอคำสั่ง SQL ครับ
« ตอบกลับ #6 เมื่อ: กรกฎาคม 13, 2010, 18:22:15 PM »
0
ปัญหาที่พบจาก 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
ทำด้วยหัวใจร.พ.สมเด็จพระสังฆราช องค์ที่ 17 อ.สองพี่น้อง จ.สุพรรณบุรี
อบรมโดย BMS Team เมื่อ พ.ย. 49 ขึ้นระบบห้องบัตรเมื่อ X'Mas 2007
2008 : X-Ray กายภาพบำบัด แพทย์แผนไทย กิจกรรมบำบัด OPD ตา
2009 : ทันตกรรม ห้องตรวจตา OPD (พยาบาลและห้องตรวจแพทย์บางห้อง)

ออฟไลน์ udomchok

  • Hero Member
  • *****
  • กระทู้: 8,347
  • Respect: +589
    • ดูรายละเอียด
    • ร.พ.สมเด็จพระสังฆราช องค์ที่ 17
Re: ขอคำสั่ง SQL ครับ
« ตอบกลับ #7 เมื่อ: กรกฎาคม 13, 2010, 18:27:45 PM »
0
จากคำตอบทั้ง 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 เท่านั้นเอง
ทำด้วยหัวใจร.พ.สมเด็จพระสังฆราช องค์ที่ 17 อ.สองพี่น้อง จ.สุพรรณบุรี
อบรมโดย BMS Team เมื่อ พ.ย. 49 ขึ้นระบบห้องบัตรเมื่อ X'Mas 2007
2008 : X-Ray กายภาพบำบัด แพทย์แผนไทย กิจกรรมบำบัด OPD ตา
2009 : ทันตกรรม ห้องตรวจตา OPD (พยาบาลและห้องตรวจแพทย์บางห้อง)

ออฟไลน์ udomchok

  • Hero Member
  • *****
  • กระทู้: 8,347
  • Respect: +589
    • ดูรายละเอียด
    • ร.พ.สมเด็จพระสังฆราช องค์ที่ 17
Re: ขอคำสั่ง SQL ครับ
« ตอบกลับ #8 เมื่อ: กรกฎาคม 13, 2010, 18:53:25 PM »
0
ปัญหาที่เจอในข้อมูลของ 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
ทำด้วยหัวใจร.พ.สมเด็จพระสังฆราช องค์ที่ 17 อ.สองพี่น้อง จ.สุพรรณบุรี
อบรมโดย BMS Team เมื่อ พ.ย. 49 ขึ้นระบบห้องบัตรเมื่อ X'Mas 2007
2008 : X-Ray กายภาพบำบัด แพทย์แผนไทย กิจกรรมบำบัด OPD ตา
2009 : ทันตกรรม ห้องตรวจตา OPD (พยาบาลและห้องตรวจแพทย์บางห้อง)

ออฟไลน์ udomchok

  • Hero Member
  • *****
  • กระทู้: 8,347
  • Respect: +589
    • ดูรายละเอียด
    • ร.พ.สมเด็จพระสังฆราช องค์ที่ 17
Re: ขอคำสั่ง SQL ครับ
« ตอบกลับ #9 เมื่อ: กรกฎาคม 13, 2010, 18:58:32 PM »
0
       2.ต้องการทราบว่ามีผู้ป่วย ที่เป็นเบาหวานและเป็นความดันที่เป็นรายใหม่กี่ราย ครับ ในช่วง 1ต.ค.52-30 ก.ย.53
       3.ต้องการทราบว่ามีผู้ป่วย ที่เป็นเบาหวานและเป็นความดันที่เป็นรายเก่ากี่ราย ครับ ในช่วง 1ต.ค.52-30 ก.ย.53   
ข้อ 2 และข้อ 3 ไม่สามารถบอกได้ หากไม่ขึ้นทะเบียนผู้ป่วยเหล่านี้ (ลงข้อมูลใน clinic พิเศษ)
เพราะในหน้าจอคลินิกพิเศษจะมีปีที่เริ่มป่วย เราสามารถดึงตรงนี้มาได้ครับ หากคำว่า "เป็นรายใหม่" หมายถึง เพิ่มเริ่มป่วย
แต่ถ้า "เป็นรายใหม่" หมายถึง เพิ่งมารับการรักษาที่เรา (เก่าที่อื่น...ใหม่ที่เรา) ก็ต้องไปดูที่ registry date

สรุปว่ายังไงก็ต้องลงทะเบียนเข้า clinic พิเศษก่อนครับ
ทำด้วยหัวใจร.พ.สมเด็จพระสังฆราช องค์ที่ 17 อ.สองพี่น้อง จ.สุพรรณบุรี
อบรมโดย BMS Team เมื่อ พ.ย. 49 ขึ้นระบบห้องบัตรเมื่อ X'Mas 2007
2008 : X-Ray กายภาพบำบัด แพทย์แผนไทย กิจกรรมบำบัด OPD ตา
2009 : ทันตกรรม ห้องตรวจตา OPD (พยาบาลและห้องตรวจแพทย์บางห้อง)

ออฟไลน์ udomchok

  • Hero Member
  • *****
  • กระทู้: 8,347
  • Respect: +589
    • ดูรายละเอียด
    • ร.พ.สมเด็จพระสังฆราช องค์ที่ 17
Re: ขอคำสั่ง SQL ครับ
« ตอบกลับ #10 เมื่อ: กรกฎาคม 13, 2010, 19:01:10 PM »
0
หากนำความรู้ที่ได้จากกระทู้นี้ 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
ทำด้วยหัวใจร.พ.สมเด็จพระสังฆราช องค์ที่ 17 อ.สองพี่น้อง จ.สุพรรณบุรี
อบรมโดย BMS Team เมื่อ พ.ย. 49 ขึ้นระบบห้องบัตรเมื่อ X'Mas 2007
2008 : X-Ray กายภาพบำบัด แพทย์แผนไทย กิจกรรมบำบัด OPD ตา
2009 : ทันตกรรม ห้องตรวจตา OPD (พยาบาลและห้องตรวจแพทย์บางห้อง)

ออฟไลน์ wiphusit

  • Hero Member
  • *****
  • กระทู้: 2,426
  • ยอดกมล
  • Respect: +4
    • ดูรายละเอียด
    • โรงพยาบาลทับปุด
Re: ขอคำสั่ง SQL ครับ
« ตอบกลับ #11 เมื่อ: กุมภาพันธ์ 22, 2011, 16:52:47 PM »
0
หากนำความรู้ที่ได้จากกระทู้นี้ 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
แล้วถ้าต้องการนับจำนวนละครับ
วิภูษิต  คงแก้ว เจ้าพนักงานเครื่องคอมพิวเตอร์ 
โรงพยาบาลทับปุด
อำเภอทับปุด จ.พังงา 82180
โทร 0-7659-9019 ต่อ 117,101
โทรสาร 0-7659-9115
Thailand.