คำสั่ง SQL เบื้องต้น ในงานสาธารณสุข
คำสั่ง SQL เบื้องต้น ในงานสาธารณสุข
คำสั่งเบื้องต้นของภาษา SQL
SELECT attribute_1, attribute_2,…, attribute_n
FROM table_name
WHERE condition
GROUP BY ….
ORDER BY ….
LIMIT …. ;
การใช้ฟังก์ชั่น COUNT(), DISTINCT , CONCAT();
ฟังก์ชั่นใช้ในการนับ ไม่นับซ้ำ หรือ ไม่นับซ้ำหลายฟิลด์ เช่นการนับจำนวนคนที่มารับบริการรายหน่วยงานในเดือนนั้นโดยไม่นับซ้ำคนเดิม หรือการนับจำนวนครั้งที่มารับบริการโดยที่ในวันหนึ่งให้นับเป็นครั้งเดียว ดังตัวอย่าง
ตัวอย่างที่ 1 การนับจำนวนผู้รับบริการทุกประเภทเดือน มกราคม 2558 แยกรายหน่วยบริการ สรุปเป็นจำนวน คน และ ครั้งในวันเดียวกันให้นับเป็นหนึ่งครั้ง จากแฟ้ม service
SELECT
s.HOSPCODE AS `รหัสหน่วยงาน`,
Count(DISTINCT CONCAT(s.HOSPCODE,s.PID)) AS `คน`,
Count(DISTINCT s.HOSPCODE,s.PID,s.DATE_SERV) AS `ครั้ง`
FROM
service AS s
WHERE
s.DATE_SERV BETWEEN '2015-01-01' AND '2015-01-31'
GROUP BY
s.HOSPCODE;
ตัวอย่างที่ 2 การนับจำนวนผู้ป่วยนอก เดือน มกราคม 2558 แยกรายหน่วยบริการ สรุปเป็นจำนวน คน และ ครั้งในวันเดียวกันให้นับเป็นหนึ่งครั้ง จากแฟ้ม diagnosis_opd
SELECT d.HOSPCODE AS 'รหัสหน่วยบริการ',
COUNT(DISTINCT d.HOSPCODE,d.PID) AS 'คน',
COUNT(DISTINCT d.HOSPCODE,d.PID,d.SEQ) AS 'ครั้ง'
FROM diagnosis_opd AS d
INNER JOIN cdisease AS c ON d.DIAGCODE = c.diagcode
WHERE
d.DATE_SERV BETWEEN '2015-01-01' AND '2015-01-31' AND
c.code504 IS NOT NULL
GROUP BY d.HOSPCODE;
การใช้ฟังก์ชั่น LEFT(), RIGHT() , SUBSTRING();
ข้อมูล 43 แฟ้ม หลายกรณีได้ใช้ฟังก์ชั่นต่างๆ เหล่านี้ เช่น การเก็บข้อมูลวันที่ให้บริการฟิลด์ date_serv เก็บในรูปแบบ yyyy-mm-dd หากต้องการปี-เดือน เพื่อใช้ในการกรองข้อมูล ใช้ฟังก์ชั่น LEFT(date_serv,7) จะได้ข้อมูลในรูปแบบ yyyy-mm หรือข้อมูลรหัสหมู่บ้านฟิลด์ vhid เก็บข้อมูลในรูปแบบ ccaattmm (จังหวัด,อำเภอ,ตำบล,หมู่บ้าน) หากต้องการหมู่ที่ใช้ฟังก์ชั่น RIGHT(vhid,2) ฟังก์ชั่น SUBSTRING() นิยมใช้ตัดข้อมูลในช่วงกลาง เช่น รหัสหัตถการฟิลด์ procedure เก็บรหัส 9007811 รหัสตำแหน่งที่ 4 และ 5 หากเป็น 77 , 78 หรือ 79 คือรหัสบริการแพทย์แผนไทย สามารถกรองได้โดยใช้ฟังก์ชั่น SUBSTRING() ระบุตำแห่งที่ต้องการเริ่มตัด นับตำแหน่งแรกเป็นตำแหน่งที่ 1 และ จำนวนอักขระที่ต้องการตัด กรณีนี้เขียนดังนี้ SUBSTRING(procedure,4,2)
ตัวอย่างที่ 3 การนับจำนวนผู้รับบริการหัตถการแพทย์แผนไทยเพื่อการรักษา ในเดือน มกราคม 2556 เป็นรายหน่วยบริการ นับสรุปเป็นจำนวน คน ครั้ง และรายการหัตถการ จากแฟ้ม proced
SELECT p.HOSPCODE AS `รหัสหน่วยงาน`,
COUNT(DISTINCT p.HOSPCODE,p.PID) AS `คน`,
COUNT(DISTINCT p.HOSPCODE,p.PID,p.DATE_SERV) AS `ครั้ง`,
COUNT(DISTINCT p.HOSPCODE,p.PID,p.DATE_SERV,p.PROCEDCODE) AS `รายการหัตถการ`
FROM
procedure_opd AS p
WHERE
LEFT(p.DATE_SERV,7) = '2015-01' AND
SUBSTRING(p.PROCEDCODE,4,2) = '78'
GROUP BY p.HOSPCODE ORDER BY p.HOSPCODE ASC;
การใช้ฟังก์ชั่น SUM(), SUM(CASE WHEN …. THEN 1 ELSE 0 END)
การใช้ฟังก์ชั่น SUM() ในฐานข้อมูล HDC อาจทำให้ช้าเนื่องจากฐานข้อมูลออกแบบเก็บตัวเลขในรูปแบบ Text แต่ก็สามารถทำได้ และการใช้ฟังก์ชั่น SUM(CASE WHEN เงื่อนไข THEN 1 ELSE 0 END) นำมาใช้ในกรณีที่ต้องการนับแบบมีเงื่อนไข
ตัวอย่างที่ 4 หามูลค่าการใช้ยาสมุนไพร กับมูลค่าการใช้ยาทั้งหมด ข้อมูลให้บริการเดือนมกราคม 2558 สรุปเป็นรายหน่วยบริการ ให้ใช้มูลค่าต้นทุน
SELECT
HOSPCODE AS 'รหัสหน่วยบริการ',
SUM(AMOUNT * DRUGCOST) AS 'มูลค่าทั้งหมด',
SUM(CASE WHEN LEFT(DIDSTD,1)='4' THEN (AMOUNT * DRUGCOST) ELSE 0 END) AS 'มูลค่ายาสมุนไพร'
FROM drug_opd
WHERE
LEFT(DATE_SERV,7) = '2015-01'
GROUP BY HOSPCODE;
ตัวอย่างที่ 5 ตรวจสอบข้อมูลจำหนวนการให้บริการรายเดือน ตุลาคม 2557 – มีนาคม 2558 เป็นรายหน่วยบริการ เพื่อตรวจสอบดูปริมาณข้อมูลของแต่ละหน่วยบริการ จากแฟ้ม service
SELECT
s.HOSPCODE,
SUM(CASE WHEN SUBSTRING(s.date_serv,1,7) = '2014-10' Then 1 Else 0 END) AS m5710,
SUM(CASE WHEN SUBSTRING(s.date_serv,1,7) = '2014-11' Then 1 Else 0 END) AS m5711,
SUM(CASE WHEN SUBSTRING(s.date_serv,1,7) = '2014-12' Then 1 Else 0 END) AS m5712,
SUM(CASE WHEN SUBSTRING(s.date_serv,1,7) = '2015-01' Then 1 Else 0 END) AS m5801,
SUM(CASE WHEN SUBSTRING(s.date_serv,1,7) = '2015-02' Then 1 Else 0 END) AS m5802,
SUM(CASE WHEN SUBSTRING(s.date_serv,1,7) = '2015-03' Then 1 Else 0 END) AS m5803
FROM
service AS s
WHERE
s.date_serv BETWEEN '2014-10-01' AND '2015-03-31'
GROUP BY s.HOSPCODE;
การใช้ฟังก์ชั่น DATEDIFF(), DATE_ADD(), DATE_SUB(),TIMESTAMPDIFF()
ข้อมูล 43 แฟ้ม และฐานข้อมูล HDC เก็บข้อมูลวันที่เป็น date ต่างจาก 21 แฟ้ม เก็นเป็น text ในรูปแบบ yyyymmdd การคำนวณอายุถึงปัจจุบัน(ปี) จากฟิลด์ birth ใช้รูปแบบดังนี้ DATEDIFF(CURDATE(),BIRTH)/365.25 หรือ ในกรณีที่เราต้องการหากลุ่มเป้าหมายอายุครบตามเกณฑ์ในช่วงประเมิน เพื่อลดขั้นตอนในการคำนวณวันเกิดย้อนหลัง ใช้ฟังชั่น DATE_ADD() เพิ่มอายุเข้าไป เช่น เด็กอายุครบ 3 ปีบริบูรณ์ ในช่วง 1 ตุลาคม 2557 – 31 มีนาคม 2558 สร้างเงื่อนไขได้ดังนี้ DATE_ADD(p.birth,INTERVAL 3 YEAR) BETWEEN '2014-10-01' AND '2015-03-31'
ตัวอย่างที่ 6 สรุปข้อมูลเด็กอายุไม่เกิน 6 ปี เป็นรายหน่วยงาน ที่มีชีวิตอยู่และอยู่จริงในพื้นที่ จากแฟ้ม person
SELECT
p.HOSPCODE AS รหัสหน่วยงาน,
COUNT(*) AS จำนวน
FROM
person AS p
WHERE
p.DISCHARGE = '9' AND
p.TYPEAREA IN ('1', '3') AND
(DATEDIFF(CURDATE(),DATE_FORMAT(p.BIRTH,'%Y%m%d')))/365.25 < 6
GROUP BY p.HOSPCODE;
## TIMESTAMPDIFF(YEAR,p.BIRTH,CURDATE()) < 6
ตัวอย่างที่ 7 สรุปข้อมูลเด็กอายุครบ 5 ปีบริบูรณ์ ในช่วงประเมิน ตุลาคม 2557 – มีนาคม 2558 เป็นรายหน่วยงาน ที่มีชีวิตอยู่และอยู่จริงในพื้นที่ จากแฟ้ม person
SELECT
p.HOSPCODE AS รหัสหน่วยงาน,
COUNT(*) AS จำนวน
FROM
person AS p
WHERE
p. DISCHARGE = '9' AND
p.TYPEAREA IN ('1', '3') AND
DATE_ADD(p.BIRTH,INTERVAL 5 YEAR) BETWEEN '2014-10-01' AND '2015-03-31'
GROUP BY p.HOSPCODE;
การสร้างตารางผลลัพท์ CREATE TABLE … SELECT … , DROP TABLE tb1,tb2;
การประมวลผลข้อมูลโดยการเชื่อมตารางหลายตาราง ในแต่ละตารางก็มีปริมาณข้อมูลมาก ทำให้การประมวลผลช้าใช้เวลานาน การเพิ่มประสิทธิภาพการประมวลผล อาจมีการประมวลสร้างตารางข้อมูลให้ได้ข้อมูลตามที่ต้องการก่อนทำให้ปริมาณข้อมูลลดลง ประมวลผลหลายขั้นตอน บางครั้งก็จำเป็นต้องใช้เทคนิคการสร้างตารางผลลัพท์ไว้ใช้ชั่วคราวก่อนแล้วค่อยลบตารางชั่วคราวทิ้ง ในกรณีที่ปริมาณข้อมูลไม่มากการสร้างตารางชั่วคราวอาจใช้คำสั่ง CREATE TEMPORARY TABLE หากปริมาณข้อมูลมากอาจทำให้หน่วยความจำเต็มทำให้ Server ทำงานช้า
ตัวอย่างที่ 8 ประเมินความครอบคลุมการได้รับวัคซีนกลุ่มอายุครบ 1 ปี บริบูรณ์ในช่วงประเมิน ประเมินการรับวัคซีน MMR ที่ได้รับวัคซีน
แหล่งข้อมูล 43 แฟ้ม
แฟ้มที่ใช้ในการประมวลผล
- person,epi
เงื่อนไขในการกรองข้อมูล
1. เด็กที่ครบ 1 ปีในวันประมวลผล คือเกิดวันที่ 1 เมษายน 2556 ถึง วันที่ประมวลผล
2. สาเหตุการจำหน่าย = ไม่จำหน่าย (9)
3. สถานะบุคคล = มีชื่ออยู่จริง หรือ ไม่มีชื่ออยู่จริง ( 1,3 )
4. รับบริการที่หน่วยบริการที่ไหนก็ได้ในจังหวัดสกลนคร นับผลงานให้หน่วยที่เป็นสถานะอยู่จริง
5. ต้องบันทึกรหัสวัคซีน 071,072,061,M11,M12
SET @kpi_id = 304;
SET @date_start = '2014-04-01';
SET @date_end = IF(CURRENT_DATE() <= '2015-03-31',CURDATE(),'2015-03-31');
##สร้างตารางชั่วคราว ไว้รองรับข้อมูล
DROP TABLE IF EXISTS `tc_tmp_prm_vacc_1`;
CREATE TABLE `tc_tmp_prm_vacc_1` (
`hospcode` char(5) NOT NULL,
`cid` char(13) DEFAULT NULL,
`pid` char(15) NOT NULL,
`name` char(50) NOT NULL,
`lname` char(50) NOT NULL,
`birth` char(8) NOT NULL,
`mmr` char(1) DEFAULT '0',
`date_serv` char(8) NOT NULL,
`vcctype` char(8) NOT NULL,
PRIMARY KEY (`hospcode`,`pid`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
##ประมวลผลกลุ่มเป้าหมาย
INSERT INTO `tc_tmp_prm_vacc_1`
SELECT
hdc.person.hospcode,
hdc.person.cid,
hdc.person.pid,
hdc.person.name,
hdc.person.lname,
hdc.person.birth,
'0' AS mmr,
hdc.epi.DATE_SERV,
hdc.epi.VACCINETYPE
FROM
hdc.person left join hdc.epi on hdc.person.HOSPCODE = hdc.epi.HOSPCODE AND hdc.person.PID = hdc.epi.PID
WHERE
hdc.person.discharge = '9' AND
hdc.person.typearea IN ('1', '3') AND
(DATE_ADD(hdc.person.birth,INTERVAL 1 YEAR) BETWEEN @date_start AND @date_end)
group by hdc.person.CID;
##ตรวจสอบรับวัคซีน
UPDATE `tc_tmp_prm_vacc_1` AS t,hdc.epi AS e
SET t.mmr='1',t.date_serv=e.date_serv,t.vcctype=e.VACCINETYPE
WHERE
t.hospcode = e.hospcode AND
t.pid = e.pid AND
e.VACCINETYPE in('071','072','061','M11','M12');
##สรุป
SELECT
hospcode,
@kpi_id,
COUNT(*) AS target,
SUM(CASE WHEN mmr = '1' THEN 1 ELSE 0 END) AS result,
FORMAT((SUM(CASE WHEN mmr = '1' THEN 1 ELSE 0 END)/COUNT(*)*100),2) AS per
FROM
tc_tmp_prm_vacc_1
GROUP BY
hospcode
ORDER BY hospcode;
##ลบตารางชั่วคราว
##DROP TABLE tc_tmp_prm_vacc_1;
เทคนิคการประมวลผลข้อมูลจากฐานข้อมูล Health Data Center
จากประสบการณ์การประมวลผลเพื่อใช้ประโยชน์ข้อมูลจาก 43 แฟ้ม ฐานข้อมูล Health Data Center พอสรุปกระบวนการและขั้นตอนการประมวลผลเพื่อเพิ่มประสิทธิภาพการประมวลผล ดังนี้
1. สร้างตารางรับข้อมูลจากการประมวลผล ในขั้นตอนนี้ควรสร้างตารางรับข้อมูลรายบุคคลสำหรับกลุ่มเป้าหมายที่นำมาประเมินผลงาน เพื่อใช้ตรวจสอบข้อมูลรายบุคคลกับหน่วยบริการที่บันทึกข้อมูล หรือ ในกรณีที่ไม่ต้องการตรวจสอบข้อมูลรายบุคคลกับหน่วยบริการก็สามารถสร้างตารางสรุปรายหน่วยบริการ ออกแบบตารางและ PRIMARY KEY ให้ถูกต้องเหมาะสม
2. ประมวลผลกลุ่มเป้าหมาย ในขั้นตอนนี้ต้องศึกษาคำจำกัดความตามรายละเอียดตัวชี้วัด เพื่อให้ได้เป้าหมายที่ตรงตามคำจำกัดความที่กำหนดในรายละเอียดตัวชี้วัด เพิ่มเข้าไปในตารางรับข้อมูลในขั้นตอนที่ 1
3. ประมวลผลผลงาน ในขั้นตอนนี้ต้องศึกษาคำจำกัดความ และวิธีการนับผลงานที่ถูกต้อง วิธีการที่จะนับผลงานต้องทำความเข้าใจหรือเป็นข้อตกลงเบื้องต้นกับหน่วยบริการที่บันทึกข้อมูลมาก่อนแล้วเพื่อไม่ให้เกิดข้อโต้แย้งผลงานภายหลัง และการนับผลงานต้องนับให้ตรงกับกลุ่มเป้าหมายตามข้อ 2 การให้บริการนอกกลุ่มเป้าหมายจะไม่ถูกนับมาเป็นผลงาน ประมวลผลผลงานเพิ่มเข้าไปในตารางรับข้อมูลในขั้นตอนที่ 1
4. ประมวลผลสรุป ในขั้นตอนนี้อาจมีการประมวลผลเพื่อแปรผลในตารางในข้อ 1 ก่อนมีการนับสรุปผลงานเป็นรายหน่วยบริการ หรือเป็นรายอำเภอ หรือหากต้องการสร้าง Data Warehouse ก็ประมวลผลตารางสรุปข้อมูลไปที่ฐานข้อมูลใหม่
5. การลบตารางข้อมูลชั่วคราว ในขั้นตอนนี้เป็นการลบข้อมูลชั่วคราวที่ไม่จำเป็นต้องใช้แล้วออกไป ต้องระมัดระวังหาก ลบตารางข้อมูลผิดอาจเกิดความเสียหายต่อฐานข้อมูลได้
การสร้าง Store Procedure & Event MySQL
Stored Procedure คือการเขียน sql ฝังเอาไว้ในส่วนของ Server ซึ่งจะทำการ Compile ครั้งเดียวหลังเขียนเสร็จ ซึ่งจะทำให้การทำงานเร็วขึ้น และ Event Schedule สามารถตั้งเวลาการทำงานให้กับ MySQL (MySQL 5.5.1x ขึ้นไป เวอร์ชั่นที่สนับสนุนการสร้าง Procedure)
Work Flow Process การทำงานแบบพักข้อมูล
การใช้งาน ต้องเปิดใช้ event โดยเพิ่ม สคริปเข้าไปที่ไฟล์ my.ini ในส่วน [mysqld] แล้ว Restart Service MySQL
[mysqld]
# Set the event ON
event_scheduler=1
การสร้าง Store Procedure ด้วย Navicat
1. สร้าง Query sql Statement สำหรับประมวลสร้างตารางรายงาน Output
ตัวอย่าง ประมวลผลนับจำนวนผู้ป่วยเบาหวานจำแนกรายสถานบริการ ไปที่ database test
DROP TABLE IF EXISTS pt_dm_group_office;
CREATE TABLE pt_dm_group_office
SELECT
c.pcucode,
COUNT(DISTINCT CONCAT(c.pcucode,c.pid)) AS DM
FROM
chronic AS c
WHERE (LEFT(c.chronic,3) BETWEEN 'E10' AND 'E14') AND
c.typedis = '03'
GROUP BY c.pcucode ;
2. ที่โปรแกรม Navicat เลือกฐานข้อมูล provisdb คลิกขวาที่ Functions เลือก New Function
เลือก Type Procedure คลิกเลือก Finish
3. นำ Sql Statement ที่ออกแบบไว้วางระหว่าง BEGIN กับ END;
4. บันทึก และ ตั้งชื่อ Procedure ดังตัวอย่างตั้งชื่อเป็น Test01
5. การตั้ง event คลิก new Event ตรง Definition เรียกใช้ Procedure test01 (call test01)
6. การตั้งเวลาตั้งค่าที่ tab Scheduale แล้วบันทึก Event และ Procedure จะฝังสคริปทำงานที่ฝั่ง Server
7. ตรวจสอบผลการทำงานของ Event
การวิเคราะห์ออกแบบเงื่อนไขการประมวลผลข้อมูลรายงานงานผลการปฏิบัติงานตามตัวชี้วัด
ตัวชี้วัดกระทรวงสาธารณสุข ให้ใช้ข้อมูลจากชุดข้อมูลมาตรฐาน 21 แฟ้ม หรือ 43 แฟ้ม ในการติดตาม ประเมินผล เพื่อลดภาระการรายงานของหน่วยบริการ จึงต้องเป็นหน้าที่ของระดับจังหวัดที่ทำหน้าที่เป็นหน่วยงานกำกับ ติดตาม ประเมินผล ประมวลผลข้อมูลที่หน่วยบริการส่งให้ระดับจังหวัด รวบรวมเป็น Provis Data Center หรือ Health Data Center ผู้รับผิดชอบงานระดับจังหวัดจึงควรเข้าใจขั้นตอนการประมวลผลข้อมูล และแจ้งแนวทางบันทึกข้อมูลให้หน่วยบริการบันทึกได้ถูกต้อง
ตัวอย่างที่ 12 การวิเคราะห์ประมวลผลข้อมูลตอบตัวชี้วัดที่ 39 สัดส่วนของจำนวนผู้ป่วยนอกเบาหวาน/ความดันโลหิตสูงที่ไปรับการรักษาที่ ศสม./รพ.สต. (มากกว่าร้อยละ 50)
จากการศึกษารายละเอียดตัวชี้วัด
ผลงาน =
ผู้ป่วยเบาหวานที่มารับบริการผู้ป่วยนอกด้วยโรคเบาหวาน (A)
จำนวนผู้ป่วยเบาหวานที่ขึ้นทะเบียนที่หน่วยบริการทั้งหมด (B)
X 100
B = ผู้ป่วยเบาหวาน LEFT(c.chronic,3) BETWEEN 'E10' AND 'E14' ที่ขึ้นทะเบียนที่หน่วยบริการ เป็นประชากรในเขตรับผิดชอบ typearea IN ('1', '3') ยังมีชีวิตอยู่ dischar = '9' ยังรักษาอยู่ typedis = '03'
A = ผู้ป่วยเบาหวานที่ขึ้นทะเบียน B มารับบริการด้วยโรคเบาหวาน LEFT(diagcode,3) BETWEEN 'E10' AND 'E14') ที่หน่วยบริการในปีงบประมาณ 2556 date_serv BETWEEN '20121001' AND '20130930'
ออกแบบ sql ประมวลผลข้อมูลจาก Provis
##สร้างตารางชั่วคราว ไว้รองรับข้อมูล
DROP TABLE IF EXISTS `tmp_prm_dm_1`;
CREATE TABLE `tmp_prm_dm_1` (
`pcucode` char(5) NOT NULL,
`cid` char(13) DEFAULT NULL,
`pid` char(15) NOT NULL,
`name` char(50) NOT NULL,
`lname` char(50) NOT NULL,
`serv` char(1) DEFAULT '0',
PRIMARY KEY (`pcucode`,`pid`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
##กลุ่มป่วยที่ขึ้นทะเบียนในพื้นที่ มีชีวิต และยังรักษา เพิ่มไปที่ตารางชั่วคราว
INSERT IGNORE tmp_prm_dm_1
SELECT p.pcucode,p.cid,p.pid,p.name,p.lname,'0' AS serv
FROM
person AS p
Inner Join chronic AS c ON p.pcucode = c.pcucode AND p.pid = c.pid
WHERE
p.dischar = '9' AND
p.typearea IN ('1', '3') AND
LEFT(c.chronic,3) BETWEEN 'E10' AND 'E14' AND c.typedis = '03';
##สร้างตารางชั่วคราว ไว้รองรับข้อมูลการให้บริการ
DROP TABLE IF EXISTS `tmp_prm_dm_2`;
CREATE TABLE `tmp_prm_dm_2` (
`pcucode` char(5) NOT NULL,
`pid` char(15) NOT NULL,
PRIMARY KEY (`pcucode`,`pid`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
##เพิ่มผู้รับบริการในกลุ่มโรค ในปีงบประมาณไปที่ตาราง
INSERT IGNORE tmp_prm_dm_2
(SELECT
d.pcucode,
d.pid
FROM
diag AS d
WHERE
d.date_serv BETWEEN '20121001' AND '20130930' AND
LEFT(d.diagcode,3) BETWEEN 'E10' AND 'E14');
##ปรับปรุงผู้มารับบริการในตาราง temp หลัก
UPDATE tmp_prm_dm_1 AS t,tmp_prm_dm_2 AS s
SET t.serv = '1'
WHERE t.pcucode = s.pcucode AND t.pid = s.pid;
##ประมวลผลสรุปรายหน่วยงาน ไว้ที่ฐานข้อมูล warehouse
CREATE TABLE wh_nkp.kpi39_pt_dm_service_pcu
SELECT t.pcucode,o.off_name,COUNT(*) AS n,
SUM(CASE WHEN t.serv='1' THEN 1 ELSE 0 END) AS tt,
FORMAT(SUM(CASE WHEN t.serv='1' THEN 1 ELSE 0 END)/COUNT(*) * 100,2) AS per
FROM `tmp_prm_dm_1` AS t ,co_office AS o
WHERE t.pcucode = o.off_id AND
o.off_type IN('03')
GROUP BY t.pcucode;
##ลบตารางชั่วคราว
DROP TABLE tmp_prm_dm_1,tmp_prm_dm_2;
*** สัดส่วนของจำนวนผู้ป่วยนอกโรคความดันโลหิตสูง ปรับปรุงจากตัวอย่าง สัดส่วนของจำนวนผู้ป่วยนอกโรคเบาหวาน
Last updated