ก่อนอื่นขอออกตัวไว้ก่อนว่าผมไม่ได้มา blame ใคร และผมก็ไม่ได้เก่งในเรื่องทำ Report หรือการเขียน SQL มากนัก แต่ก็พอใช้งานได้การทำ Report ของพวกเราชาว Admin HOSxP นั้น หลาย ๆ ท่านสอบถามมาเกี่ยวกับการใช้คำสั่งรูปแบบต่าง ๆ การกำหนดเงื่อนไขต่าง ๆ เพื่อที่จะสร้าง report ใหม่ ๆ ขึ้นมา แต่(คิดว่า)ยังไม่มีใครเคยตรวจสอบ Report ที่มากับตัวโปรแกรม และหลาย ๆ ท่านนำไปใช้งาน
นอกจากนี้มีหลาย ๆ เงื่อนไขในการทำรายงานเพื่อให้สารสนเทศที่ถูกต้องบางเงื่อนไข เรายังใช้กันไม่ถูกต้อง ซึ่งผมเคยแนะนำไปในกระทู้ก่อนหน้านี้แล้ว เช่น การใช้เงื่อนไขเวลา อาจทำให้ข้อมูล/สารสนเทศที่ได้ผิดพลาด
ลองดูตัวอย่าง report นี้ครับ
SYSTEM-RX-DRUG-USE-TOP-PRICE-SUMMARY
ChangeReportSQL('select d.name,d.strength,d.units,count(distinct vn) as vn_count,sum(qty) as sum_qty,sum(o.sum_price) as sum_price '+
' from opitemrece o,drugitems d '+
' where o.icode = d.icode and o.rxdate '+
' between "'+ds1+'" and "'+ds2+'" '+
' group by d.name,d.strength,d.units '+
' order by sum_price desc limit 20 ');
เปรียบเทียบกับ
ChangeReportSQL('select concat(d.name," ", d.strength," ", d.units) as drugname, count(o.icode) as scripts, sum(o.qty) as sumqty, sum(o.sum_price) as sumprice ' +
'from opitemrece o ' +
'join drugitems d on d.icode=o.icode ' +
'where (o.rxdate between "' + bdate + '" and "' + edate + '") ' +
'group by o.icode ' +
'order by sumprice desc ' +
'limit 20');
ซึ่งเป็นชุดคำสั่งที่ผมเขียนขึ้น (ก่อนจะไปเปิดดูใน "รายงาน","ระบบรายงานหลัก" แล้วเจอเจ้าตัวรายงานข้างบน...เพราะให้น้องห้องยาเปิดใช้...ผมเลยไม่ค่อยได้ดู) ไปทำเป็น Custom report อีกตัวหนึ่งแทน (CUSTOM-Top20DrugUse) ตามที่เคยเผยแพร่ไปแล้ว
พบว่าชุดคำสั่งทั้ง 2 ให้ผลเกือบเหมือนกัน แต่ที่ต่างกันคือจำนวนใบสั่งยา ซึ่งได้จาก count(distinct vn) as vn_count และ count(o.icode) as scripts
ต่างกันอย่างไร...ผมขออธิบายนิดหนึ่ง
ใน SYSTEM-RX-DRUG-USE-TOP-PRICE-SUMMARY ใช้การนับใบสั่งยา (ในตัว Report ใช้คำว่า "รายการ") จาก vn โดยเลือกนับ vn ที่ไม่ซ้ำกัน (distinct vn) คำสั่งนี้จะไม่ผิดพลาดหาก vn ใน opitemrece มีค่าทั้งหมด (ไม่เป็นค่าว่าง) แต่ในความเป็นจริงเราจะพบว่า vn ใน opitemrece สามารถเป็นค่าว่างได้ กรณีที่รายการยานั้นเป็นของผู้ป่วยใน ดังนั้นการนับโดยใช้ vn แบบไม่ซ้ำกัน จึงผิดพลาด เพราะจะไปนับเอาใบสั่งยาของผู้ป่วยในที่มีหลายใบเป็นในเดียวกัน....นี่แหละทำให้จำนวนใบสั่งยา ("รายการ" ในตัว Report) จึงน้อยกว่าที่ควรจะเป็น
ดังนั้น...จงอย่าเชื่อสิ่งที่คนอื่นบอกทั้งหมด ให้ใช้หลักกาลามสูตร 10 ประการ (
http://th.wikipedia.org/wiki/%E0%B8%81%E0%B8%B2%E0%B8%A5%E0%B8%B2%E0%B8%A1%E0%B8%AA%E0%B8%B9%E0%B8%95%E0%B8%A3) ของพระพุทธเจ้าที่ตรัสสอนไว้ครับ
ผมอยากให้พวกเราได้ข้อมูล/สารสนเทศที่ถูกต้อง เพื่อนำไปตอบสนองผู้ที่ต้องการใช้อย่างถูกต้อง