คำสั่ง MySQL ที่น่ารู้และ code จำเป็นในการสร้างรายงาน BMS-HOSxP


บทความนี้เหมาะกับใคร

รวมคำสั่ง MySQL ที่ใช้บ่อยสำหรับผู้ดูแลระบบ HOSxP และคนที่ต้องเขียนรายงานเอง ตั้งแต่คำสั่งพื้นฐาน SELECT / INSERT / UPDATE ไปจนถึงการ JOIN ตาราง และโค้ดฝั่ง Report Designer พร้อมตัวอย่างใช้งานจริง กดปุ่มคัดลอกมุมขวาบนของกล่องโค้ดไปใช้ได้ทันที

1. คำสั่งตรวจสอบระบบ (Monitoring)

ชุดคำสั่งสำหรับเช็กสถานะเซิร์ฟเวอร์และโครงสร้างตาราง ใช้บ่อยตอนระบบช้าหรือต้องหาสาเหตุปัญหา

คำสั่งใช้ทำอะไร
SHOW MASTER STATUS;ตรวจสอบการทำงานของเครื่อง Master
SHOW SLAVE STATUS;ตรวจสอบการทำงานของเครื่อง Slave
SHOW FULL PROCESSLIST;ดูว่าตอนนี้ใครใช้งาน MySQL อยู่บ้าง และคำสั่งไหนค้าง
SHOW CREATE TABLE ชื่อตาราง;ดูคำสั่งที่ใช้สร้างตารางนั้นขึ้นมา
DESCRIBE ชื่อตาราง;ดูโครงสร้างและรายละเอียดฟิลด์ทั้งหมด
กลับขึ้นสารบัญ

2. จัดการฐานข้อมูล (Database)

-- สร้างฐานข้อมูลใหม่
CREATE DATABASE `test`;

-- ลบฐานข้อมูลทิ้ง
DROP DATABASE `test`;
กลับขึ้นสารบัญ

3. จัดการตาราง (Table)

3.1 สร้างตารางใหม่จากผลลัพธ์ของ SELECT

ใช้บ่อยมากเวลาต้องการสำรองข้อมูลก่อนแก้ไข หรือพักข้อมูลไว้ทำรายงาน

CREATE TABLE pttype_group2 AS
SELECT * FROM patient
WHERE pttype = '20';

3.2 เพิ่มและแก้ไขฟิลด์

-- เพิ่มฟิลด์ใหม่
ALTER TABLE test ADD COLUMN age INT;

-- แก้ไขชนิดข้อมูลของฟิลด์เดิม
ALTER TABLE test MODIFY COLUMN name VARCHAR(100);

3.3 ลบตาราง

DROP TABLE `pttype_group2`;
กลับขึ้นสารบัญ

4. ดึงข้อมูลด้วย SELECT

-- เลือกข้อมูลทั้งหมด
SELECT * FROM test;

-- เลือกเฉพาะบางฟิลด์
SELECT id, name FROM test;

-- เงื่อนไขแบบเท่ากับ
SELECT * FROM test WHERE id = 1;

-- ค้นหาแบบขึ้นต้นด้วย
SELECT * FROM test WHERE name LIKE 'สม%';

-- ช่วงวันที่
SELECT * FROM ovst
WHERE vstdate BETWEEN '2020-01-01' AND '2020-01-31';

-- หลายค่าในฟิลด์เดียว
SELECT * FROM patient WHERE pttype IN ('10', '20', '30');

-- ค่าว่าง
SELECT * FROM patient WHERE hos_guid IS NULL;
เงื่อนไขที่ใช้บ่อยใน WHERE: = > < BETWEEN AND OR LIKE IN IS NULL
กลับขึ้นสารบัญ

5. เพิ่ม / แก้ไข / ลบข้อมูล

-- เพิ่มข้อมูล
INSERT INTO test (id, name)
VALUES ('1', 'ทดสอบ');

-- แก้ไขข้อมูล: ปรับ type_area ของผู้ป่วยในพื้นที่ที่กำหนด
UPDATE patient
SET type_area = '4'
WHERE chwpart = '31'
  AND amppart = '11'
  AND tmbpart = '02';

-- ลบข้อมูล
DELETE FROM test WHERE id = '1';
ข้อควรระวังก่อนรัน UPDATE และ DELETE
  1. สำรองฐานข้อมูล (Backup) ทุกครั้งก่อนแก้ไขข้อมูลจริง
  2. ลองเปลี่ยนเป็น SELECT * FROM ... ด้วยเงื่อนไข WHERE เดียวกันก่อน เพื่อดูว่าจะกระทบกี่แถว
  3. อย่ารัน UPDATE หรือ DELETE โดยไม่มี WHERE เด็ดขาด เพราะจะกระทบทั้งตาราง
กลับขึ้นสารบัญ

6. การ JOIN ตาราง

ตัวอย่างจริง: นับจำนวนการบันทึก bps, bpd, bw, pulse, temperature โดยไม่นับค่าว่างและค่าศูนย์ เฉพาะผู้ป่วยที่ถูกส่งไปจุดซักประวัติ

SELECT ov.vstdate,
       COUNT(o1.vn) AS bps_count,
       COUNT(o2.vn) AS bpd_count,
       COUNT(o3.vn) AS bw_count,
       COUNT(o4.vn) AS pulse_count,
       COUNT(o5.vn) AS temp_count
FROM ovst ov
LEFT OUTER JOIN opdscreen o1 ON o1.vn = ov.vn AND o1.bps > 0
LEFT OUTER JOIN opdscreen o2 ON o2.vn = ov.vn AND o2.bpd > 0
LEFT OUTER JOIN opdscreen o3 ON o3.vn = ov.vn AND o3.bw > 0
LEFT OUTER JOIN opdscreen o4 ON o4.vn = ov.vn AND o4.pulse > 0
LEFT OUTER JOIN opdscreen o5 ON o5.vn = ov.vn AND o5.temperature > 0
GROUP BY ov.vstdate;
จำง่าย ๆ: INNER JOIN เอาเฉพาะแถวที่มีคู่กันทั้งสองตาราง ส่วน LEFT JOIN เอาแถวจากตารางซ้ายมาให้ครบ ถ้าตารางขวาไม่มีคู่จะได้ NULL
กลับขึ้นสารบัญ

7. ตัวอย่างใช้งานจริงใน HOSxP

7.1 เชื่อมที่อยู่ให้เป็นข้อความเต็ม

SELECT p.hn, p.pname, p.fname, p.lname,
       CONCAT(p.addrpart, ' หมู่ที่ ', p.moopart,
              ' ต.', t3.name,
              ' อ.', t2.name,
              ' จ.', t1.name) AS fulladdressname
FROM patient p
LEFT OUTER JOIN thaiaddress t1
  ON t1.chwpart = p.chwpart AND t1.amppart = '00' AND t1.tmbpart = '00'
LEFT OUTER JOIN thaiaddress t2
  ON t2.chwpart = p.chwpart AND t2.amppart = p.amppart AND t2.tmbpart = '00'
LEFT OUTER JOIN thaiaddress t3
  ON t3.chwpart = p.chwpart AND t3.amppart = p.amppart AND t3.tmbpart = p.tmbpart;

7.2 คำนวณอายุจากวันเกิด

SELECT p.hn, p.fname, p.lname,
       YEAR(CURRENT_DATE) - YEAR(p.birthday) AS age
FROM patient p;

7.3 เติมค่า hos_guid ที่ยังว่างอยู่

UPDATE ชื่อตาราง
SET hos_guid = UPPER(CONCAT('{', UUID(), '}'))
WHERE hos_guid IS NULL;
กลับขึ้นสารบัญ

8. โค้ดฝั่ง Report Designer

8.1 แปลงตัวเลขเป็นตัวหนังสือภาษาไทย (ThaiMoney)

// แสดงผลเป็น: เก้าสิบหกบาท
Value := ThaiMoney(variable1.value);

// แสดงผลเป็น: (เก้าสิบหกบาท)
Value := '(' + ThaiMoney(variable1.value) + ')';

// ใช้กับผลรวม เช่น sum(mon11) ที่ตั้งชื่อว่า DBCalc1
Value := ThaiMoney(DBCalc1.value);

8.2 ดึงค่า Parameter มาแสดงในรายงาน

Value := 'ระหว่างวันที่ ' + GetUserParameter(0) +
         ' ถึง ' + GetUserParameter(1);
กลับขึ้นสารบัญ
เขียนโดย : วันสว่าง กาญจนการี (อาท)
Wansawang Kanchanakaree 
แสดงความคิดเห็น (0)
ใหม่กว่า เก่ากว่า