draft · ok
2026-10-14 20:55:39 · เครื่อง 127.0.0.1 · งาน #6 · 22.7 วินาที
คำขอ / คำสั่ง
ขอรายงานคนไข้ที่มีวินิจฉัย icd10 แบบ principle เป็น common cold โดยมีลำดับ วันที่มารับบริการ hn ชื่อ-สกุล อายุ แพทย์ผู้วินิจฉัย สามารถเลือกช่วงวันที่ได้
รายละเอียด
{
"check": [],
"error": null,
"hits": [],
"kind": "report",
"notes": [
"\u0e23\u0e2d\u0e1a 1: \u0e1c\u0e48\u0e32\u0e19"
],
"sql": "select o.vstdate, o.hn, concat(p.pname, p.fname, \u0027 \u0027, p.lname) as pt_name, v.age_y as age, d.name as doctor_name from ovst o join ovstdiag od on od.vn = o.vn join vn_stat v on v.vn = o.vn left join patient p on p.hn = o.hn left join doctor d on d.code = od.doctor join icd101 i on i.code = od.icd10 where o.vstdate between :date1 and :date2 and od.diagtype = \u00271\u0027 and i.code = \u0027J00\u0027 order by o.vstdate, o.vsttime"
}prompt ที่ส่งให้ AI (2 ครั้ง ใน 3 นาทีก่อนหน้า)
2026-10-14 20:55:38 · draft · 5.5 วินาที · prompt 13,854 ตัวอักษร
messages
[{"role": "system", "content": "คุณเขียน SQL (MySQL 8) สำหรับรายงาน HOSxP/EHP จากคำขอภาษาไทย\n- SELECT เดียว ห้ามมี ; ห้ามแก้ข้อมูล\n- ถ้ามีช่วงวันที่ ใช้ parameter :date1 และ :date2 เท่านั้น\n- ใช้เฉพาะตาราง/คอลัมน์ที่อยู่ในรายการ \"ตาราง/คอลัมน์ที่มีจริง\" ด้านล่าง (อ่านคำอธิบายตารางก่อนเลือก)\n- ตัวอย่างรายงานจริงใช้ดูรูปแบบ join/เงื่อนไขเท่านั้น\n- ทุกคอลัมน์ต้องมี alias เป็นภาษาอังกฤษ a-z0-9_ เท่านั้น (ห้าม alias ภาษาไทย ห้ามใส่ quote)\n- columns: field = alias ทุกตัวใน select (ตามลำดับ) พร้อมหัวคอลัมน์ (caption) ภาษาไทยสั้นๆ\n- ถ้า SELECT เดียวทำไม่ได้ (เช่น วนทุกหน่วยบริการในจังหวัดแล้วนับในฐานข้อมูลของแต่ละหน่วย หรือแต่ละแถวต้องคิวรี่แยก)\n ให้ทำแบบ *clientdataset: sql = รายการแถว และต้องมีคอลัมน์รอค่าไว้ก่อน (0 as visits / 0.00 as price / '' as note),\n per_row = ขั้นที่เติมค่าทีละแถว {field, kind: integer|double|string, sql: SELECT ที่คืนค่าเดียว}\n ใน sql ของ per_row ใช้ {ชื่อคอลัมน์} แทนค่าจากแถวนั้น เช่น select count(*) from {db_name}.ovst where vstdate between :date1 and :date2\n ค่าข้อความต้องครอบ quote เอง เช่น where pttype = '{pttype}' (ชื่อฐานข้อมูล/ตาราง เช่น {db_name}.ovst ไม่ต้องครอบ)\n รายชื่อหน่วยบริการทั้งจังหวัดอยู่ที่ ehp_report.ehp_hospcode (HospitalCode, HospitalName, TableSchema = ชื่อฐานข้อมูลของหน่วย,\n amppart, amppart_name, chwpart) จังหวัดของเราคือ (select chwpart from hospcode where hospcode = (select hospitalcode from opdconfig))\n ห้ามเปลี่ยน ehp_report.ehp_hospcode เป็นตารางอื่น ; รายงานทั่วไปให้ per_row = []\n- ช่องให้ผู้ใช้กรอกตอนพิมพ์ (เช่น คำค้นชื่อยา): inputs = [{name: a-z0-9_ เช่น keyword, label: ข้อความถามภาษาไทย, sample: ค่าตัวอย่าง}]\n ใน SQL ใช้ :name นอก quote เท่านั้น เช่น drugitems.name like concat('%', :keyword, '%')\n ห้ามเขียน '%:keyword%' (อยู่ใน quote จะไม่ถูกแทนค่า) ; ไม่มีช่องกรอกให้ inputs = []\nตัวอย่างรายงานจริง:\n-- CUSTOM-EHP-REPORT-ข้อมููลการรับบริการ แสดงผู้วินิจฉัย ตามช่วงวันที่รับบริการ\nselect o.vstdate,o.vsttime,o.hn,concat(p.pname,\" \",p.fname,\" \",p.lname) as pt_name,d.name as doctor_name,d.licenseno,od.icd10\r\nfrom ovst o\r\njoin ovstdiag od on od.vn=o.vn\r\nleft join patient p on p.hn=o.hn\r\nleft join doctor d on d.code=od.doctor\r\nleft join doctor_position dp on dp.id = d.position_id\r\nleft join kskdepartment k on k.depcode=o.main_dep\r\nwhere o.vstdate between :date1 and :date2\r\nand od.diagtype = '1' \r\norder by doctor_name,o.vstdate,o.vsttime\r\n\n\n-- CUSTOM-EHP-REPORT-ข้อมูลการรับบริการ แสดงจุดบริการ การวินิจฉัย และการนัดหมายครั้งถัดไป\nSELECT\r\novst.hn,\r\novst.vstdate,\r\novst.vsttime,\r\nCONCAT(patient.pname, ' ', patient.fname, ' ', patient.lname) AS patient,\r\nYEAR(CURDATE()) - YEAR(patient.birthday) AS age,\r\nCONCAT(COALESCE(patient.addrpart, ''), ' ',\r\nCASE WHEN COALESCE(patient.moopart, '') <> '' THEN CONCAT(' หมู่ที่ ', patient.moopart) END, \r\nCASE WHEN COALESCE(t1.name, '') <> '' THEN CONCAT('ต.', t1.name) END, ' ', \r\nCASE WHEN COALESCE(t2.name, '') <> '' THEN CONCAT('อ.', t2.name) END, ' ', \r\nCASE WHEN COALESCE(t3.name, '') <> '' THEN CONCAT('จ.', t3.name) END ) AS address,\r\nkskdepartment.department,\r\nGROUP_CONCAT(DISTINCT CONCAT(icd101.code) SEPARATOR ', ') AS icd10,\r\nopdscreen_doctor_pe.pe AS pe,\r\nGROUP_CONCAT(DISTINCT oapp.nextdate ORDER BY oapp.nextdate ASC SEPARATOR ', ') AS oapp,\r\ndoctor.name as doctor\r\nFROM ovst \r\nLEFT OUTER JOIN patient ON patient.hn = ovst.hn\r\nLEFT OUTER JOIN thaiaddress t1 ON t1.chwpart = patient.chwpart AND t1.amppart = patient.amppart AND t1.tmbpart = patient.tmbpart AND t1.codetype = '3' \r\nLEFT OUTER JOIN thaiaddress t2 ON t2.chwpart = patient.chwpart AND t2.amppart = patient.amppart AND t2.codetype = '2' \r\nLEFT OUTER JOIN thaiaddress t3 ON t3.chwpart = patient.chwpart AND t3.codetype = '1'\r\nLEFT OUTER JOIN kskdepartment ON kskdepartment.depcode = ovst.main_dep\r\nLEFT OUTER JOIN ovstdiag ON ovstdiag.vn = ovst.vn\r\nLEFT OUTER JOIN opdscreen ON opdscreen.vn = ovst.vn\r\nLEFT OUTER JOIN icd101 ON icd101.code = ovstdiag.icd10\r\nLEFT OUTER JOIN doctor ON doctor.code = ovstdiag.doctor\r\n\n-- EHP-XE-FORM-DOCTOR-CERT-13\nSELECT d.doctor_cert_id,\r\n d.hn, \r\n d.date1, \r\n d.date2, \r\n d.doctor_cert_number,\r\n Concat(' ', d.diag_text) AS diag_text, \r\n Concat(' ', d.note1) AS note1, \r\n d.note2, \r\n d.doctor_cert_date, \r\n Date_format(d.doctor_cert_date, '%d %M %Y') AS doctor_cert_date_eng, \r\n Concat(p1.eng_pname, p1.eng_fname, ' ', p1.eng_lname) AS ptname_eng, \r\n Concat(p.pname, p.fname, ' ', p.lname) AS ptname, \r\n c.cardno AS foreign_cardid, \r\n n.name AS nationality_name, \r\n n2.name AS citizenship_name, \r\n s.name AS sex_name, \r\n m.name AS marrystatus_name, \r\n y.employer_name, \r\n y.employer_type, \r\n y.foreign_office, \r\n o.height, \r\n o.bw, \r\n o.bps, \r\n o.pulse, \r\n o.skin_color, \r\n o.pregnancy, \r\n o.found_amphetamine, \r\n ov.vstdate, \r\n Date_format(ov.vstdate, '%d %M %Y') AS vstdate_eng, \r\n ksk.department AS department, \r\n doc.name AS doctor_name, \r\n doc.ename AS doctor_name_eng, \r\n Coalesce(doc.licenseno, doc.shortname) AS doctor_license_no, \r\n doc.license_issue_date, \r\n Date_format(doc.license_issue_date, '%d %M %Y') AS license_issue_date_eng, \r\n vs.age_y, \r\n Concat('เลขที่ ', coalesce(p.addrpart,'-'), ' หมู่ ', coalesce(p.moopart,'-'), ' ซ. ', coalesce(p.addr_soi ,'-' ), ' ถ.', coalesce(p.road,'- ' ), thaiaddress.full_name, ' ', coalesce(p.po_code,' ')) AS pt_address,\r\n p.cid, \r\n \n\nตาราง/คอลัมน์ที่มีจริง:\ndiagtype(diagtype, name, nhso_code, hos_guid, hos_guid_ext)\ndoctor(code, name, shortname, licenseno, department, jobposition, active, force_diagnosis, oldcode, search_keyword, cid, position_id, addrpart, moopart, zoipart, roadpart, tmbpart, amppart, chwpart, nationality, doctor_guid, allow_df_edit, force_icd_diagnosis, ename, spclty, clinic, doctor_department_id, name_soundex, chronic_staff, hos_guid, provider_type_code, sex, council_code, birth_date, start_date, finish_date, move_from_hospcode, move_to_hospcode, update_datetime, pname)\novst(hos_guid, vn, hn, an, vstdate, vsttime, doctor, hospmain, hospsub, oqueue, ovstist, ovstost, pttype, pttypeno, rfrics, rfrilct, rfrocs, rfrolct, spclty, rcpt_disease, hcode, cur_dep, cur_dep_busy, last_dep, cur_dep_time, rx_queue, diag_text, pt_subtype, main_dep, main_dep_queue, finance_summary_date, visit_type, node_id, contract_id, waiting, rfri_icd10, o_refer_number, has_insurance, i_refer_number, refer_type)\nvn_stat(vn, hn, pdx, gr504, lastvisit, accident_code, dx_doctor, dx0, dx1, dx2, dx3, dx4, dx5, sex, age_y, age_m, age_d, aid, moopart, count_in_month, count_in_year, pttype, income, paid_money, remain_money, uc_money, item_money, dba, spclty, vstdate, op0, op1, op2, op3, op4, op5, rcp_no, print_count, print_done, pttype_in_region)\npatient(hos_guid, hn, pname, fname, lname, occupation, citizenship, birthday, addrpart, moopart, tmbpart, amppart, chwpart, bloodgrp, clinic, deathday, drugallergy, familyno, fathername, firstday, hometel, informaddr, informname, informrelation, informtel, marrystatus, mathername, hn_int, nationality, opdlocation, pttype, religion, sex, spsname, truebirthday, workaddr, worktel, hcode, cid, hid)\nperson(person_id, house_id, cid, pname, fname, lname, pcode, sex, nationality, citizenship, education, occupation, religion, marrystatus, house_regist_type_id, birthdate, has_house_regist, chronic_disease_list, club_list, village_id, blood_group, current_age, death_date, hos_guid, income_per_year, home_position_id, family_position_id, drug_allergy, last_update, death, pttype, pttype_begin_date, pttype_expire_date, pttype_hospmain, pttype_hospsub, father_person_id, mother_person_id, pttype_no, sps_person_id, birthtime)\npttype(pttype, name, editmask, isuse, pcode, requirecode, doctor_fee, fee_code, discount, contract, paidst, in_region, uc, require_hcode, oldcode, fee_code2, price_type, debtor, noexpire, hipdata_code, min_age, max_age, bill_sss, bill_type, hipdata_pttype, use_contract_id, yearly_charge, yearly_charge_icode1, yearly_charge_icode2, region_type, pttype_group1, pttype_group2, pttype_guid, max_debt_money, allow_finance_edit, print_csmb_statement, pttype_information, fee_code_paidst, fee_code2_paidst, debt_due_day)\nopdscreen(hos_guid, vn, hn, vstdate, vsttime, begintime, outtime, endtime, bpd, bps, bw, cc, hr, pe, pulse, temperature, note, rr, cc_begin_date, cc_cause_of_visit, cc_sign, cc_duration, cc_position, cc_note, his_begin_date, his_frequency, his_severity, his_cause, his_expand, his_cause_increase, his_cause_decrease, his_related_sign, height, screen_dep, waiting, fbs, help1, help2, help3, help4)\novstdiag(ovst_diag_id, vn, icd10, hn, vstdate, vsttime, diagtype, icd103, hcode, doctor, episode, ext_code, hos_guid, dep_flag, ovst_oper_type, staff, dx_guid, lock_dx, dx_code_note, ovstdiag_severe_type_id, diag_no, update_datetime, confirm, confirm_staff, opi_guid, sct_id, icd11)\nicd101(code, name, spclty, tname, code3, code4, code5, sex, ipd_valid, icd10compat, icd10tmcompat, active_status, hos_guid, hos_guid_ext)\nspclty(spclty, name, depcode, ovstostlink, spname, shortname, ill_visit, spclty_guid, no_service_charge, no_service_charge_doctor, oldcode, nhso_code, operation, provis_code, hos_guid, no_export_43, display_order, allow_online_appointment, active_status)\n\nเอกสารออกแบบ HOSxP (ความหมายของตาราง/คอลัมน์):\n[EMRPackage_FULL.md]\n--- **Purpose / วัตถุประสงค์:** ICD-10 diagnosis codes for each OPD visit.\nรหัส ICD-10 สำหรับการวินิจฉัยแต่ละครั้งเยี่ยม OPD\n\n**Primary Key:** `ovst_diag_id` (int)\n\n| Field | Type | Key | Purpose (EN) | วัตถุประสงค์ (TH) |\n|---|---|---|---|---|\n| `ovst_diag_id` | int(11) | PRI | Diagnosis record ID | รหัสบันทึกวินิจฉัย |\n| `vn` | varchar(12) | MUL | Visit Number | เลขที่ครั้งเยี่ยม |\n| `hn` | varchar(9) | MUL | Patient HN | HN ผู้ป่วย |\n| `icd10` | varchar(9) | MUL | ICD-10 code (→ icd101) | รหัส ICD-10 |\n| `diagtype` | char(2) | | Diagnosis type (1=primary, 2=comorbid, etc.) | ประเภทวินิจฉัย |\n| `doctor` | varchar(6) | MUL | Diagnosing doctor | แพทย์วินิจฉัย |\n| `vstdate` | date | MUL | Visit date | วันที่ |\n| `diag_no` | int(11) | | Diagnosis sequence number | ลำดับวินิจฉัย |\n| `confirm` | char(1) | | Confirmed flag | สถานะยืนยัน |\n\n**Code Usage / การใช้งานในโค้ด:**\n```pascal\n// HOSxPPatientEMRDetailFrameUnit — Load diagnoses (disease codes)\novstdiagcds.Data := hosxp_getdataset(\n 'select * from ovstdiag where vn = \"' + FVN + '\" ' +\n 'and substring(icd10,1,1) not in (\"1\",\"2\",\"3\",\"4\",\"5\",\"6\",\"7\",\"8\",\"9\",\"0\") ' +\n 'order by diagtype, diag_no, ovst_diag_id');\n\n// Load procedure codes (numeric-start ICD-10)\novstdiagopercds.Data := hosxp_getdataset(\n 'select * from ovstdiag where vn = \"' + FVN + '\" ' +\n 'and substring(icd10,1,1) in (\"1\",\"2\",\"3\",\"4\",\"5\",\"6\",\"7\",\"8\",\"9\",\"0\") ' +\n 'order by diagtype, diag_no, ovst_diag_id');\n```\n\n---\n\n[IPD_KnowledgeBase_Part1.md]\n> ทุกรายการวินิจฉัย ICD-10 ของผู้ป่วยใน 1 admission = N diagnosis records > Every ICD-10 diagnosis entry for an inpatient admission. One admission has N diagnoses. | # | ฟิลด์ / Field | ชนิด / Type | ความหมาย (TH) | Meaning (EN) | ค่าเริ่มต้น / Default |\n|---|---------------|-------------|---------------|--------------|----------------------|\n| 1 | `ipt_diag_id` | INT (PK) | รหัสรายการ | Record ID | `getserialnumber('ipt_diag_id')` |\n| 2 | `an` | VARCHAR (FK→ipt) | เลข Admit | Admission number | `← FAN` in BeforePost |\n| 3 | `icd10` | VARCHAR (FK→icd101) | รหัส ICD-10 | ICD-10 code | Required, validated |\n| 4 | `diagtype` | VARCHAR (FK→diagtype) | ประเภทวินิจฉัย | Type: `'1'`=PDx (principal), others=SDx | Required |\n| 5 | `doctor` | VARCHAR (FK→doctor) | แพทย์ | Diagnosing physician | Required |\n| 6 | `diagnosis_note` | TEXT | บันทึกวินิจฉัย | Diagnosis notes (free-text) | NULL |\n| 7 | `diag_no` | INT | ลำดับ | Sequence number | Auto-assigned: PDx=1, others=2,3,4... |\n| 8 | `entry_datetime` | DATETIME | วันบันทึก | Entry timestamp | `getserverdatetime` |\n| 9 | `modify_datetime` | DATETIME | วันแก้ไข | Modification timestamp | `getserverdatetime` |\n| 10 | `staff` | VARCHAR | ผู้บันทึก | Staff who entered | `flgn` (current login) |\n\n[FDH-dataset การนำเข้าข้อมูล FDH NEW DATA SET.md]\n| | data\\[\\].encounter.diagnosisText\\[\\].professionId | Y | String | แพทย์ผู้วินิจฉัย format: ว12345 | | **▌ encounter.diagnosisIcd10\\[\\] — วินิจฉัย ICD-10** | | | | | data\\[\\].encounter.diagnosisIcd10\\[\\].dateTime | Y | DateTime | วันเวลาบันทึก — เมื่อแปลงเป็น AIPN/CIPN: IPDx.DateDiag เป็น D 10 char (YYYY-MM-DD) ต้องตัดเวลาออกทั้งหมด (รวมวินาที) | | data\\[\\].encounter.diagnosisIcd10\\[\\].diagType | Y | String | ประเภทวินิจฉัย 1=หลัก 2=comorbidity 3=complication 4=Other 5=External cause | | data\\[\\].encounter.diagnosisIcd10\\[\\].icd10 | Y | String | รหัสวินิจฉัย ICD10 — FDH บังคับใช้ ICD10 เท่านั้น (code system คงที่ ไม่ต้องเก็บแยก เช่น AIPN/CIPN IPDx.CodeSys \\= 'ICD10TM' โดยอัตโนมัติ) | | data\\[\\].encounter.diagnosisIcd10\\[\\].professionId | Y | String | แพทย์ผู้วินิจฉัย format: ว12345 | | data\\[\\].encounter.diagnosisIcd10\\[\\].sequence | Y | Integer | ลำดับใน diagnosisIcd10\\[\\] (PK) — เริ่มที่ 1, 2, 3, ...\n\n[HOSxPDentalPackage_FULL.md]\n| Column | Type | Key | Description | คำอธิบาย | |--------|------|-----|-------------|----------| | `icd10tm_operation_code` | varchar(7) | **PRI** | Operation code | รหัสหัตถการ | | `description_english` | varchar(250) | | English description"}, {"role": "user", "content": "ขอรายงานคนไข้ที่มีวินิจฉัย icd10 แบบ principle เป็น common cold\nโดยมีลำดับ วันที่มารับบริการ hn ชื่อ-สกุล อายุ แพทย์ผู้วินิจฉัย\nสามารถเลือกช่วงวันที่ได้"}]คำตอบ
{"title": "รายงานผู้ป่วยวินิจฉัย Common Cold (Principal Diagnosis)", "sql": "select o.vstdate, o.hn, concat(p.pname, p.fname, ' ', p.lname) as pt_name, v.age_y as age, d.name as doctor_name from ovst o join ovstdiag od on od.vn = o.vn join vn_stat v on v.vn = o.vn left join patient p on p.hn = o.hn left join doctor d on d.code = od.doctor join icd101 i on i.code = od.icd10 where o.vstdate between :date1 and :date2 and od.diagtype = '1' and i.code = 'J00' order by o.vstdate, o.vsttime", "columns": [{"field": "vstdate", "caption": "วันที่รับบริการ"}, {"field": "hn", "caption": "HN"}, {"field": "pt_name", "caption": "ชื่อ-สกุล"}, {"field": "age", "caption": "อายุ (ปี)"}, {"field": "doctor_name", "caption": "แพทย์ผู้วินิจฉัย"}]}2026-10-14 20:55:17 · rerank · 0.6 วินาที · prompt 1,098 ตัวอักษร
messages
[{"role": "system", "content": "เลือกรายงานที่ตรงกับคำขอที่สุด ตอบเป็นเลขลำดับ"}, {"role": "user", "content": "คำขอ: ขอรายงานคนไข้ที่มีวินิจฉัย icd10 แบบ principle เป็น common cold\nโดยมีลำดับ วันที่มารับบริการ hn ชื่อ-สกุล อายุ แพทย์ผู้วินิจฉัย\nสามารถเลือกช่วงวันที่ได้\n0. CUSTOM-EHP-REPORT-ข้อมููลการรับบริการ แสดงผู้วินิจฉัย ตามช่วงวันที่รับบริการ — การลงวินิจฉัย แยกตามผู้วินิจฉัย ตามช่วงวันที่\n1. CUSTOM-EHP-REPORT-รายงานสรุปลูกหนี้ค่ารักษาพยาบาลผู้ป่วยนอก แยกตามสิทธิการรักษา (นค1)-ตามผู้วินิจฉัย — รายงานสรุปลูกหนี้ค่ารักษาพยาบาลผู้ป่วยนอก แยกตามสิทธิการรักษา (นค1)-ตามผู้วินิจฉัย\n2. CUSTOM-EHP-REPORT-ข้อมูลการรับบริการ แสดงจุดบริการ การวินิจฉัย และการนัดหมายครั้งถัดไป — ข้อมูลการรับบริการ แสดงจุดบริการ การวินิจฉัย และการนัดหมายครั้งถัดไป\n3. CUSTOM-EHP-REPORT-Fee schedule-จำนวนผู้ที่มีอายุตั้งแต่ 60 ปีขึ้นไปได้รับบริการตรวจคัดกรองโรคซึมเศร้า — จำนวนผู้ที่มีอายุตั้งแต่ 60 ปีขึ้นไปได้รับบริการตรวจคัดกรองโรคซึมเศร้า\n4. CUSTOM-EHP-REPORT-ทะเบียนผู้มารับบริการ และแสดงสิทธิการรักษา สถานพยาบาลหลัก เลขที่สิทธิ — ทะเบียนผู้มารับบริการ และแสดงสิทธิการรักษา สถานพยาบาลหลัก เลขที่สิทธิ"}]คำตอบ
{"best": 0}