ไตรมาส เป็นช่วงระยะเวลาสามเดือน ซึ่งแบ่งช่วงเวลา หนึ่งปี ออกเป็น สี่ ไตรมาส ในเชิงธุรกิจการพิจารณาผลประกอบการนิยมใช้ช่วงเวลาไตรมาส ในการประเมินผล กรณีที่เป็นตามปีปฏิทินจะแบ่งได้
- ไตรมาสที่ 1 หมายถึงช่วงเดือนมกราคมถึงมีนาคม
- ไตรมาสที่ 2 หมายถึงช่วงเดือนเมษายนถึงมิถุนายน
- ไตรมาสที่ 3 หมายถึงช่วงเดือนกรกฎาคมถึงกันยายน
- ไตรมาสที่ 4 หมายถึงช่วงเดือนตุลาคมถึงธันวาคม
แต่ระบบราชการของไทย ระบบรายงานส่วนใหญ่ขึ้นกับปีงบประมาณ ^_^
ปีงบประมาณ หรือ ปีงบการเงิน (อังกฤษ: fiscal year, financial year หรือ budget year) เป็นช่วงเวลาที่ใช้สำหรับคำนวณงบการเงินประจำปีในธุรกิจและองค์กรอื่น ๆ ในหลายเขตอำนาจตามกฎหมาย กฎข้อบังคับเกี่ยวกับการบัญชีและการเก็บภาษี จะต้องอาศัยรายงานเหล่านี้อย่างน้อยครั้งหนึ่งต่อสิบสองเดือน แต่ไม่จำเป็นว่าช่วงเวลาที่รายงานนี้จะต้องตรงกับปีตามปฏิทิน ซึงปีงบประมาณของไทยเริ่มตั้งแต่เดือนตุลาคมถึงเดือนกันยายนของปีถัดไป
ดังนั้นระบบไตรมาสจึงแบ่งออกเป็น
- ไตรมาสที่ 1 หมายถึงช่วงเดือนตุลาคมถึงธันวาคม
- ไตรมาสที่ 2 หมายถึงช่วงเดือนมกราคมถึงมีนาคม
- ไตรมาสที่ 3 หมายถึงช่วงเดือนเมษายนถึงมิถุนายน
- ไตรมาสที่ 4 หมายถึงช่วงเดือนกรกฎาคมถึงกันยายน
ซึ่งใน MySQL เองก็มีฟังก์ชั่นที่คำนวณหาไตรมาสชื่อ QUARTER อยู่แล้วซึ่งอิงจากปีปฏิทิน
QUARTER(date) : Returns the quarter of the year for date, in the range 1 to 4.
mysql> SELECT QUARTER('2016-10-18'); +-----------------------+ | QUARTER('2016-10-18') | +-----------------------+ | 4 | +-----------------------+
ผลอิงจากปีปฏิทินก็ตามนั้น ^_^ อ้าวว งั้นเรามาสร้างฟังก์ชั่นหาไตรมาสจากปีงบประมาณกัน
CREATE DEFINER=`root`@`localhost` FUNCTION `THQUARTER`( xdate DATETIME, th BIT) RETURNS int(11) DETERMINISTIC BEGIN DECLARE qt INT; SET qt = QUARTER(xdate) + th; RETURN IF(qt > 4, qt - 4, qt); END -- Test mysql> SELECT THQUARTER('2016-10-18'); +-----------------------+ | THQUARTER('2016-10-18') | +-----------------------+ | 1 | +-----------------------+
มาลองเรียกใช้งานกัน สมมุติโจทย์ต้องการหารายงานการรับบริการของผู้ป่วยในสถานบริการแยกรายไตรมาส (ครั้ง)
-- Generate dummy data CREATE TABLE `visit` ( `visitno` mediumint(8) unsigned NOT NULL auto_increment, `visitdate` varchar(255), `pid` varchar(255) default NULL, `pcucode` varchar(255) default NULL, PRIMARY KEY (`visitno`) ) AUTO_INCREMENT=1; INSERT INTO `visit` (`visitdate`,`pid`,`pcucode`) VALUES ("2017-01-09","5","yellow"),("2017-06-11","9","orange"),("2016-11-28","9","yellow"),("2017-06-02","2","red"),("2017-01-09","10","orange"),("2017-05-03","10","orange"),("2017-07-06","8","red"),("2017-06-25","10","yellow"),("2017-04-19","3","orange"),("2017-06-12","3","yellow"); INSERT INTO `visit` (`visitdate`,`pid`,`pcucode`) VALUES ("2016-11-12","10","orange"),("2017-06-18","5","red"),("2017-05-20","9","yellow"),("2017-04-01","2","red"),("2016-12-31","6","red"),("2017-02-05","8","orange"),("2017-02-19","3","red"),("2017-03-13","5","red"),("2017-03-27","3","yellow"),("2017-06-22","8","yellow"); INSERT INTO `visit` (`visitdate`,`pid`,`pcucode`) VALUES ("2017-01-17","6","red"),("2016-10-15","5","yellow"),("2017-05-30","8","orange"),("2017-04-29","5","red"),("2017-01-02","3","orange"),("2017-09-04","4","red"),("2017-01-09","3","orange"),("2016-12-15","7","yellow"),("2017-01-31","8","orange"),("2016-11-08","6","yellow"); INSERT INTO `visit` (`visitdate`,`pid`,`pcucode`) VALUES ("2017-01-10","5","orange"),("2016-11-20","3","yellow"),("2017-07-09","8","red"),("2017-01-20","8","red"),("2017-05-17","8","red"),("2017-08-05","5","yellow"),("2017-07-19","7","red"),("2017-05-06","10","yellow"),("2017-06-01","6","orange"),("2016-11-06","9","red"); INSERT INTO `visit` (`visitdate`,`pid`,`pcucode`) VALUES ("2017-09-20","5","orange"),("2017-01-28","8","yellow"),("2017-02-20","7","red"),("2016-11-24","5","orange"),("2016-12-27","5","orange"),("2017-05-20","6","yellow"),("2017-07-03","1","red"),("2017-09-09","8","yellow"),("2017-06-04","9","red"),("2017-03-04","9","orange"); INSERT INTO `visit` (`visitdate`,`pid`,`pcucode`) VALUES ("2017-09-12","6","orange"),("2017-07-24","1","yellow"),("2017-02-27","5","red"),("2017-08-21","3","yellow"),("2017-01-26","2","orange"),("2017-05-08","8","orange"),("2016-12-26","2","red"),("2017-06-24","7","red"),("2017-02-20","6","red"),("2017-04-18","10","yellow"); INSERT INTO `visit` (`visitdate`,`pid`,`pcucode`) VALUES ("2017-03-01","6","yellow"),("2017-07-15","1","yellow"),("2016-11-11","4","yellow"),("2017-06-27","10","orange"),("2017-01-02","10","orange"),("2017-05-08","7","orange"),("2017-03-16","2","red"),("2017-02-27","4","orange"),("2017-02-14","4","orange"),("2017-04-23","9","yellow"); INSERT INTO `visit` (`visitdate`,`pid`,`pcucode`) VALUES ("2016-12-02","1","orange"),("2017-04-15","9","yellow"),("2017-01-25","6","yellow"),("2017-05-06","7","yellow"),("2017-07-31","8","orange"),("2017-07-23","4","yellow"),("2017-06-02","7","red"),("2017-02-06","7","yellow"),("2017-02-14","6","red"),("2017-07-27","3","yellow"); INSERT INTO `visit` (`visitdate`,`pid`,`pcucode`) VALUES ("2016-10-21","1","red"),("2017-01-13","5","red"),("2017-06-06","1","red"),("2017-01-16","7","yellow"),("2017-01-29","9","orange"),("2016-11-06","7","red"),("2017-01-06","2","red"),("2017-01-12","6","yellow"),("2017-06-29","5","red"),("2017-04-04","10","yellow"); INSERT INTO `visit` (`visitdate`,`pid`,`pcucode`) VALUES ("2017-03-11","10","red"),("2017-05-22","2","red"),("2017-03-21","2","yellow"),("2017-02-19","3","orange"),("2016-11-30","3","red"),("2017-06-30","2","yellow"),("2017-09-17","2","red"),("2017-04-21","7","orange"),("2017-02-12","1","yellow"),("2017-05-12","7","red");
ผลลัพธ์
mysql> SELECT -> pcucode, -> SUM(IF(THQUARTER(visitdate, 1) = 1, 1, 0)) AS Q1, -> SUM(IF(THQUARTER(visitdate, 1) = 2, 1, 0)) AS Q2, -> SUM(IF(THQUARTER(visitdate, 1) = 3, 1, 0)) AS Q3, -> SUM(IF(THQUARTER(visitdate, 1) = 4, 1, 0)) AS Q4, -> COUNT(visitno) AS Total -> FROM visit -> GROUP BY pcucode -> WITH ROLLUP; +---------+------+------+------+------+-------+ | pcucode | Q1 | Q2 | Q3 | Q4 | Total | +---------+------+------+------+------+-------+ | orange | 4 | 13 | 9 | 3 | 29 | | red | 6 | 12 | 12 | 6 | 36 | | yellow | 6 | 10 | 12 | 7 | 35 | | NULL | 16 | 35 | 33 | 16 | 100 | +---------+------+------+------+------+-------+ 4 rows in set (0.02 sec)
ปั่นรายงานกันต่อ T_T