BMS-HOSxP Community
HOSxP => การเขียน SQL Script => ข้อความที่เริ่มโดย: komanp ที่ มีนาคม 27, 2009, 15:52:56 PM
-
ช่วยดู mysql หน่อยครับ
ต้องการคัดกรองข้อมูลคนไข้ที่ admit โดยมีวินิจฉัย เป็นเบาหวานมีโรคแทรกซ้อน เช่น เป็นเบาหวานแล้วมีแผลด้วย หรือเป็นเบาหวาน แล้วเป็นโรคตา
และ บางทีมานอนโรงพยาบาลแล้ว diax หลักเป็นแผล diax รองเป็นเบาหวาน(คือมานอนแล้วหมอเพิ่มdiax รองเป็นเบาหวาน)
ต้องเพิ่มหรือลบยังไงบ้างครับ
select a.hn,a.an,a.pdx,a.dx0,a.dx1,a.dx2,a.dx3,a.dx4,a.dx5,concat(p.pname,p.fname,' ',p.lname) as ptname from an_stat a
left outer join patient p on p.hn=a.hn
where a.dchdate between '2007-12-01' and '2008-09-30'
and (a.pdx like 'E110' or a.dx0 like 'E110' or a.dx1 like 'E110' or a.dx2 like 'E110' or a.dx3 like 'E110' or a.dx4 like 'E110' )
(a.pdx >= 'L03' and a.pdx <= 'L09')
diax ของแผล L030 ถึง L099
-
ลองทดสอบดู
select a.hn,a.an,a.pdx,a.dx0,a.dx1,a.dx2,a.dx3,a.dx4,a.dx5,concat(p.pname,p.fname,' ',p.lname) as ptname from an_stat a
left outer join patient p on p.hn=a.hn
where a.dchdate between '2007-12-01' and '2008-09-30'
and ( (a.pdx >= "E100" and a.pdx <= "E149")
or (a.dx0 >= "E100" and a.dx0 <= "E149")
or (a.dx1 >= "E100" and a.dx1 <= "E149")
or (a.dx2 >= "E100" and a.dx2 <= "E149")
or (a.dx3 >= "E100" and a.dx3 <= "E149")
or (a.dx4 >= "E100" and a.dx4 <= "E149")
or (a.dx5 >= "E100" and a.dx5 <= "E149"))
and ((a.dx0 >= "L030" and a.dx0 <= "L099")
or (a.dx1 >= "L030" and a.dx1 <= "L099")
or (a.dx2 >= "L030" and a.dx2 <= "L099")
or (a.dx3 >= "L030" and a.dx3 <= "L099")
or (a.dx4 >= "L030" and a.dx4 <= "L099")
or (a.dx5 >= "L030" and a.dx5 <= "L099"))
-
ทำเสร็จเอามาจแกมั้งเด้อครับ ;D
-
and ( (a.pdx >= "E100" and a.pdx <= "E149")
or (a.dx0 >= "E100" and a.dx0 <= "E149")
or (a.dx1 >= "E100" and a.dx1 <= "E149")
or (a.dx2 >= "E100" and a.dx2 <= "E149")
or (a.dx3 >= "E100" and a.dx3 <= "E149")
or (a.dx4 >= "E100" and a.dx4 <= "E149")
or (a.dx5 >= "E100" and a.dx5 <= "E149"))
ถ้าจะเอา diax ที่เป็นเบาหวานรหัส E100,E110,E119,E149 ต้องทำไงครับ
-
and ( (a.pdx >= "E100" and a.pdx <= "E149")
or (a.dx0 >= "E100" and a.dx0 <= "E149")
or (a.dx1 >= "E100" and a.dx1 <= "E149")
or (a.dx2 >= "E100" and a.dx2 <= "E149")
or (a.dx3 >= "E100" and a.dx3 <= "E149")
or (a.dx4 >= "E100" and a.dx4 <= "E149")
or (a.dx5 >= "E100" and a.dx5 <= "E149"))
ถ้าจะเอา diax ที่เป็นเบาหวานรหัส E100,E110,E119,E149 ต้องทำไงครับ
and a.pdx in ("E100","E110","E119","E149") or
a.dx0 in ("E100","E110","E119","E149") or
a.dx1 in ("E100","E110","E119","E149") or
a.dx2 in ("E100","E110","E119","E149") or
a.dx3 in ("E100","E110","E119","E149") or
a.dx4 in ("E100","E110","E119","E149") or
a.dx5 in ("E100","E110","E119","E149")
-
select a.hn,a.an,concat(p.pname,p.fname,' ',p.lname) as ptname
,a.pdx,a.dx0,a.dx1,a.dx2,a.dx3,a.dx4,a.dx5
from an_stat a
left join iptdiag i on i.an=a.an
left join patient p on p.hn=a.hn
where a.dchdate between '2007-12-01' and '2008-09-30'
and i.icd10 between 'E10' and 'E1499'
and (i.icd10 between 'L01' and 'L099' or i.icd10='T793' or i.icd10='L89'
or i.icd10 in ('E105','E115','E145','E100','E110','E119','E149'))
group by a.an
-
select a.hn,a.an,concat(p.pname,p.fname,' ',p.lname) as ptname
,a.pdx,a.dx0,a.dx1,a.dx2,a.dx3,a.dx4,a.dx5
from an_stat a
left join iptdiag i on i.an=a.an
left join patient p on p.hn=a.hn
where a.dchdate between '2007-12-01' and '2008-09-30'
and i.icd10 between 'E10' and 'E1499'
and (i.icd10 between 'L01' and 'L099' or i.icd10='T793' or i.icd10='L89'
or i.icd10 in ('E105','E115','E145','E100','E110','E119','E149'))
group by a.an
น่าจะเอาบรรทัดสีแดงออกด้วยครับ
-
select a.hn,a.an,a.pdx,a.dx0,a.dx1,a.dx2,a.dx3,a.dx4,a.dx5,concat(p.pname,p.fname,' ',p.lname) as ptname from an_stat a
left outer join patient p on p.hn=a.hn
where a.dchdate between '2007-12-01' and '2008-09-30'
and ((a.pdx >= 'L03' and a.pdx <= 'L09') and (dx0 like 'E110' or dx0 like 'E119' or dx0 like 'E149' or dx0 like 'E149' or dx0 like 'E100'))
order by an
ถ้าใช้ code ตัวนี้จะได้ผลตามรูปข้างล่างครับ
แต่จะได้โรคหลักเป็นล้างแผล โรครองเป็นจะเป็นเบาหวาน
แต่ผมอยากให้ตรงdiaxหลักหรือรองเป็นอะไรก็ได้ แต่ต้องไขว้กันอย่างไดอย่างหนึ่ง
เช่น diax L03 ถึง L09 จับคู่กับ E110 หรือ E119 หรือE149
หรือ E110 หรือ E119 หรือE149 อย่างใดอย่างหนึ่งจับคู่กับ L03 ถึง l09
ซึ่งผมลองเปลี่ยนให้เป็น
select a.hn,a.an,a.pdx,a.dx0,a.dx1,a.dx2,a.dx3,a.dx4,a.dx5,concat(p.pname,p.fname,' ',p.lname) as ptname from an_stat a
left outer join patient p on p.hn=a.hn
left join iptdiag i on i.an=a.an
where a.dchdate between '2007-12-01' and '2008-09-30'
and ((i.icd10 >= 'L03' and i.icd10 <= 'L09') or i.icd10 in ('E119','E110','E149','E100') )
order by an
ข้อมูลที่ได้จะออกมาเยอะเลยครับ
ซึ่งจะมันจะเอาอย่างใดอย่างหนึ่งขึ้นมา
เช่น เอา diax หลักหรือรองอย่างใดอย่างหนึ่งขึ้นมา
ดังรูปที่สอง
-
ลองดูอันนี้ครับ
select a.hn,a.an,a.pdx,a.dx0,a.dx1,a.dx2,a.dx3,a.dx4,a.dx5,concat(p.pname,p.fname,' ',p.lname) as ptname from an_stat a
left outer join patient p on p.hn=a.hn
where a.dchdate between '2007-12-01' and '2008-09-30'
and (a.pdx >= 'L03' and a.pdx <= 'L09' )
and (dx0 like 'E110' or dx0 like 'E119' or dx0 like 'E149' or dx0 like 'E149' or dx0 like 'E100')
union
select a.hn,a.an,a.pdx,a.dx0,a.dx1,a.dx2,a.dx3,a.dx4,a.dx5,concat(p.pname,p.fname,' ',p.lname) as ptname from an_stat a
left outer join patient p on p.hn=a.hn
where a.dchdate between '2007-12-01' and '2008-09-30'
and (a.pdx like 'E110' or a.pdx like 'E119' or a.pdx like 'E149' or a.pdx like 'E149' or a.pdx like 'E100')
and (dx0 >= 'L03' and dx0 <= 'L09' )
order by an
-
select a.hn,a.an,a.pdx,a.dx0,a.dx1,a.dx2,a.dx3,a.dx4,a.dx5,concat(p.pname,p.fname,' ',p.lname) as ptname from an_stat a
left outer join patient p on p.hn=a.hn
left join iptdiag i on i.an=a.an
where a.dchdate between '2007-12-01' and '2008-09-30'
and ((i.icd10 >= 'L03' and i.icd10 <= 'L09') and i.icd10 in ('E119','E110','E149','E100') )
group by a.an
order by a.an
-
select a.hn,a.an,a.pdx,a.dx0,a.dx1,a.dx2,a.dx3,a.dx4,a.dx5,concat(p.pname,p.fname,' ',p.lname) as ptname from an_stat a
left outer join patient p on p.hn=a.hn
left join iptdiag i on i.an=a.an
where a.dchdate between '2007-12-01' and '2008-09-30'
and ((i.icd10 >= 'L03' and i.icd10 <= 'L09') and i.icd10 in ('E119','E110','E149','E100') )
group by a.an
order by a.an
ผมคิดว่าโค้ดนี้น่าจะได้ 'L09') and i.icd10 in ตรงนี้น่าจะได้
แต่พอลองรันดูมันไม่มีข้อมูล ทั้ง ๆ ที่ข้อมูลก็มีอยู่
-
ลองดูอันนี้ครับ
select a.hn,a.an,a.pdx,a.dx0,a.dx1,a.dx2,a.dx3,a.dx4,a.dx5,concat(p.pname,p.fname,' ',p.lname) as ptname from an_stat a
left outer join patient p on p.hn=a.hn
where a.dchdate between '2007-12-01' and '2008-09-30'
and (a.pdx >= 'L03' and a.pdx <= 'L09' )
and (dx0 like 'E110' or dx0 like 'E119' or dx0 like 'E149' or dx0 like 'E149' or dx0 like 'E100')
union
select a.hn,a.an,a.pdx,a.dx0,a.dx1,a.dx2,a.dx3,a.dx4,a.dx5,concat(p.pname,p.fname,' ',p.lname) as ptname from an_stat a
left outer join patient p on p.hn=a.hn
where a.dchdate between '2007-12-01' and '2008-09-30'
and (a.pdx like 'E110' or a.pdx like 'E119' or a.pdx like 'E149' or a.pdx like 'E149' or a.pdx like 'E100')
and (dx0 >= 'L03' and dx0 <= 'L09' )
order by an
โค้ดนี้ก็ได้เหมือนโค้ดดังรูปที่ 1 ไม่ต่างกันเลย
-
ลองดูอันนี้ครับ
select a.hn,a.an,a.pdx,a.dx0,a.dx1,a.dx2,a.dx3,a.dx4,a.dx5,concat(p.pname,p.fname,' ',p.lname) as ptname from an_stat a
left outer join patient p on p.hn=a.hn
where a.dchdate between '2007-12-01' and '2008-09-30'
and (a.pdx >= 'L03' and a.pdx <= 'L09' )
and (dx0 like 'E110' or dx0 like 'E119' or dx0 like 'E149' or dx0 like 'E149' or dx0 like 'E100')
union
select a.hn,a.an,a.pdx,a.dx0,a.dx1,a.dx2,a.dx3,a.dx4,a.dx5,concat(p.pname,p.fname,' ',p.lname) as ptname from an_stat a
left outer join patient p on p.hn=a.hn
where a.dchdate between '2007-12-01' and '2008-09-30'
and (a.pdx like 'E110' or a.pdx like 'E119' or a.pdx like 'E149' or a.pdx like 'E149' or a.pdx like 'E100')
and (dx0 >= 'L03' and dx0 <= 'L09' )
order by an
โค้ดนี้ก็ได้เหมือนโค้ดดังรูปที่ 1 ไม่ต่างกันเลย
ลอง run ทีละคำสั่ง
1. คือ select a.hn,a.an,a.pdx,a.dx0,a.dx1,a.dx2,a.dx3,a.dx4,a.dx5,concat(p.pname,p.fname,' ',p.lname) as ptname from an_stat a
left outer join patient p on p.hn=a.hn
where a.dchdate between '2007-12-01' and '2008-09-30'
and (a.pdx >= 'L03' and a.pdx <= 'L09' )
and (dx0 like 'E110' or dx0 like 'E119' or dx0 like 'E149' or dx0 like 'E149' or dx0 like 'E100')
และ 2. คือ select a.hn,a.an,a.pdx,a.dx0,a.dx1,a.dx2,a.dx3,a.dx4,a.dx5,concat(p.pname,p.fname,' ',p.lname) as ptname from an_stat a
left outer join patient p on p.hn=a.hn
where a.dchdate between '2007-12-01' and '2008-09-30'
and (a.pdx like 'E110' or a.pdx like 'E119' or a.pdx like 'E149' or a.pdx like 'E149' or a.pdx like 'E100')
and (dx0 >= 'L03' and dx0 <= 'L09' )
ว่ามีข้อมูลแต่ละอันกี่ record ถ้าอันที่ 1 มีข้อมูล ส่วนอันที่ 2 ไม่มีข้อมูล ผลที่ได้ก็จะไม่ต่างกัน
จริง ๆ แล้ว pdx ที่เป็น L03 ถึง L09 แล้ว dx0 เป็น E1% น่าจะมีข้อมูล แต่ pdx ที่เป็น E1% แล้ว dx0 เป็น L03 ถึง L09 ไม่น่าจะมีครับ
-
ลองตรวจสอบข้อมูลของ IPTDIAG ดู เช่น
select a.hn,a.an,a.dchdate,i.icd10
from an_stat a
left join iptdiag i on i.an=a.an
where a.an=510001325
ว่ามีข้อมูลมั๊ย?
-
ลองตรวจสอบข้อมูลของ IPTDIAG ดู เช่น
select a.hn,a.an,a.dchdate,i.icd10
from an_stat a
left join iptdiag i on i.an=a.an
where a.an=510001325
ว่ามีข้อมูลมั๊ย?
มีข้อมูลนะครับ
ลองดูแล้ว
-
ลอง run ทีละคำสั่งตามที่ผม post ไว้ แล้ว capture หน้าจอให้ดูด้วยครับ
-
ลองดูอันนี้ครับ
select a.hn,a.an,a.pdx,a.dx0,a.dx1,a.dx2,a.dx3,a.dx4,a.dx5,concat(p.pname,p.fname,' ',p.lname) as ptname from an_stat a
left outer join patient p on p.hn=a.hn
where a.dchdate between '2007-12-01' and '2008-09-30'
and (a.pdx >= 'L03' and a.pdx <= 'L09' )
and (dx0 like 'E110' or dx0 like 'E119' or dx0 like 'E149' or dx0 like 'E149' or dx0 like 'E100')
union
select a.hn,a.an,a.pdx,a.dx0,a.dx1,a.dx2,a.dx3,a.dx4,a.dx5,concat(p.pname,p.fname,' ',p.lname) as ptname from an_stat a
left outer join patient p on p.hn=a.hn
where a.dchdate between '2007-12-01' and '2008-09-30'
and (a.pdx like 'E110' or a.pdx like 'E119' or a.pdx like 'E149' or a.pdx like 'E149' or a.pdx like 'E100')
and (dx0 >= 'L03' and dx0 <= 'L09' )
order by an
โค้ดนี้ก็ได้เหมือนโค้ดดังรูปที่ 1 ไม่ต่างกันเลย
ลอง run ทีละคำสั่ง
1. คือ select a.hn,a.an,a.pdx,a.dx0,a.dx1,a.dx2,a.dx3,a.dx4,a.dx5,concat(p.pname,p.fname,' ',p.lname) as ptname from an_stat a
left outer join patient p on p.hn=a.hn
where a.dchdate between '2007-12-01' and '2008-09-30'
and (a.pdx >= 'L03' and a.pdx <= 'L09' )
and (dx0 like 'E110' or dx0 like 'E119' or dx0 like 'E149' or dx0 like 'E149' or dx0 like 'E100')
และ 2. คือ select a.hn,a.an,a.pdx,a.dx0,a.dx1,a.dx2,a.dx3,a.dx4,a.dx5,concat(p.pname,p.fname,' ',p.lname) as ptname from an_stat a
left outer join patient p on p.hn=a.hn
where a.dchdate between '2007-12-01' and '2008-09-30'
and (a.pdx like 'E110' or a.pdx like 'E119' or a.pdx like 'E149' or a.pdx like 'E149' or a.pdx like 'E100')
and (dx0 >= 'L03' and dx0 <= 'L09' )
ว่ามีข้อมูลแต่ละอันกี่ record ถ้าอันที่ 1 มีข้อมูล ส่วนอันที่ 2 ไม่มีข้อมูล ผลที่ได้ก็จะไม่ต่างกัน
จริง ๆ แล้ว pdx ที่เป็น L03 ถึง L09 แล้ว dx0 เป็น E1% น่าจะมีข้อมูล แต่ pdx ที่เป็น E1% แล้ว dx0 เป็น L03 ถึง L09 ไม่น่าจะมีครับ
โค้ดพวกนี้จะได้ผลไม่ต่างกัน
ที่ต้องการให้ต่างน่าจะเป็นโค้ดตัวนี้
select a.hn,a.an,a.pdx,a.dx0,a.dx1,a.dx2,a.dx3,a.dx4,a.dx5,concat(p.pname,p.fname,' ',p.lname) as ptname from an_stat a
left outer join patient p on p.hn=a.hn
left join iptdiag i on i.an=a.an
where a.dchdate between '2007-12-01' and '2008-09-30'
and ((i.icd10 >= 'L03' and i.icd10 <= 'L09') and i.icd10 in ('E119','E110','E149','E100') )
group by a.an
order by a.an
แต่ติดตรง เปลี่ยน or ให้เป็น and แล้วมันไม่แสดงผลลัพธ์ and ((i.icd10 >= 'L03' and i.icd10 <= 'L09') and i.icd10 in ('E119','E110','E149','E100') )
ทั้งที่จริง ๆ แล้วข้อมูลมันมีอยู่
-
ลอง run ทีละคำสั่งตามที่ผม post ไว้ แล้ว capture หน้าจอให้ดูด้วยครับ
คำสั่งที่1 ได้ดังรูปที่ 4
คำสั่งที่2 ได้ดังรูปที่ 5
-
ลอง run ทีละคำสั่งตามที่ผม post ไว้ แล้ว capture หน้าจอให้ดูด้วยครับ
คำสั่งที่1 ได้ดังรูปที่ 4
คำสั่งที่2 ได้ดังรูปที่ 5
คำสั่งที่ให้ไปน่าจะถูกแล้ว
คือ คำสั่งที่ 1 ต้องการดูข้อมูลคนที่มี pdx เป็น L0% และเป็น E1%
ส่วนคำสั่งที่ 2 ต้องการดูข้อมูลคนที่มี pdx เป็น E1% และเป็น L0%
แต่ที่ว่ามีข้อมูลอยู่คือมีอยู่ที่ dx อื่น ที่ไม่ใช่ dx0 หรือเปล่า ถ้าใช่ต้องเพิ่ม dx1 dx2 dx3 dx4 และ dx5 เข้าไปด้วย
-
ลอง run ทีละคำสั่งตามที่ผม post ไว้ แล้ว capture หน้าจอให้ดูด้วยครับ
คำสั่งที่1 ได้ดังรูปที่ 4
คำสั่งที่2 ได้ดังรูปที่ 5
คำสั่งที่ให้ไปน่าจะถูกแล้ว
คือ คำสั่งที่ 1 ต้องการดูข้อมูลคนที่มี pdx เป็น L0% และเป็น E1%
ส่วนคำสั่งที่ 2 ต้องการดูข้อมูลคนที่มี pdx เป็น E1% และเป็น L0%
แต่ที่ว่ามีข้อมูลอยู่คือมีอยู่ที่ dx อื่น ที่ไม่ใช่ dx0 หรือเปล่า ถ้าใช่ต้องเพิ่ม dx1 dx2 dx3 dx4 และ dx5 เข้าไปด้วย
ใช่เลยครับ
นี่แหละที่เป็นปัญหา
เคยเพิ่มแล้วมันไม่ได้
ถ้าเป็นคนไข้นอกต้องไปหาตารางไหนครับ
ใช่ vn_stat ไหม
-
ได้คำตอบแล้วครับ
ขอบคุณคุณ pop_hosxp และคุณ woravet มากเลยครับ
ทำให้ได้ไอเดียทำโค้ดขึ้นมา
โค้ดที่ใกล้เคียงมากที่สุด ผมลองประยุกต์จากที่โพสให้ได้ดังนี้ครับ
select a.hn,a.an,a.pdx,a.dx0,a.dx1,a.dx2,a.dx3,a.dx4,a.dx5,concat(p.pname,p.fname,' ',p.lname) as ptname from an_stat a
left outer join patient p on p.hn=a.hn
where a.dchdate between '2007-12-01' and '2008-09-30'
and (a.pdx >= 'L030' and a.pdx <= 'L099')
or (a.dx0 >= 'L030' and a.dx0 <= 'L099' )
or (a.dx1 >= 'L030' and a.dx1 <= 'L099' )
or (a.dx2 >= 'L030' and a.dx2 <= 'L099' )
or (a.dx3 >= 'L030' and a.dx3 <= 'L099' )
or (a.dx4 >= 'L030' and a.dx4 <= 'L099' )
or (a.dx5 >= 'L030' and a.dx5 <= 'L099' )
and (a.pdx like 'E110' or a.pdx like 'E119' or a.pdx like 'E149' or a.pdx like 'E100'
or dx1 like 'E110' or dx1 like 'E119' or dx1 like 'E149' or dx1 like 'E100'
or dx2 like 'E110' or dx2 like 'E119' or dx2 like 'E149' or dx2 like 'E100'
or dx3 like 'E110' or dx3 like 'E119' or dx3 like 'E149' or dx3 like 'E100'
or dx4 like 'E110' or dx4 like 'E119' or dx4 like 'E149' or dx4 like 'E100'
or dx5 like 'E110' or dx5 like 'E119' or dx5 like 'E149' or dx5 like 'E100')
order by an
ได้ผลรายงานที่น่าพอใจ
แต่ต้องไปไล่คัดเอาอีก
แต่ข้อมูลก็น้อยลงมาก ๆ นับได้ไม่ยากครับ
นับได้แล้วเพิ่มจาก 4 ราย เป็น 6 รายครับ
ข้อมูลไม่ตกหล่นแล้ว
-
โค้ดนี้เป็นผู้ป่วยนอกครับ
ไม่แน่ใจว่าผู้ป่วยนอกต้องเป็นตารางนี้ไหม
select a.hn,a.vn,a.pdx,a.dx0,a.dx1,a.dx2,a.dx3,a.dx4,a.dx5,concat(p.pname,p.fname,' ',p.lname) as ptname from vn_stat a
left outer join patient p on p.hn=a.hn
where a.vstdate between '2007-12-01' and '2008-09-30'
and (a.pdx >= 'L030' and a.pdx <= 'L099')
or (a.dx0 >= 'L030' and a.dx0 <= 'L099' )
or (a.dx1 >= 'L030' and a.dx1 <= 'L099' )
or (a.dx2 >= 'L030' and a.dx2 <= 'L099' )
or (a.dx3 >= 'L030' and a.dx3 <= 'L099' )
or (a.dx4 >= 'L030' and a.dx4 <= 'L099' )
or (a.dx5 >= 'L030' and a.dx5 <= 'L099' )
and (a.pdx like 'E110' or a.pdx like 'E119' or a.pdx like 'E149' or a.pdx like 'E149' or a.pdx like 'E100'
or dx1 like 'E110' or dx1 like 'E119' or dx1 like 'E149' or dx1 like 'E100'
or dx2 like 'E110' or dx2 like 'E119' or dx2 like 'E149' or dx2 like 'E100'
or dx3 like 'E110' or dx3 like 'E119' or dx3 like 'E149' or dx3 like 'E100'
or dx4 like 'E110' or dx4 like 'E119' or dx4 like 'E149' or dx4 like 'E100'
or dx5 like 'E110' or dx5 like 'E119' or dx5 like 'E149' or dx5 like 'E100')
order by vn