การรวมค่า (Aggregate) ตามเดือนด้วย EXTRACT() และ GROUP BY
ใช้ EXTRACT(MONTH FROM date_column) ดึงเดือน (1-12) จากวันที่ แล้ว GROUP BY เดือน เพื่อรวมค่า (SUM, COUNT, AVG) ต่อเดือน — ไม่สนใจปี
สร้างตารางและข้อมูล
mysql> create table DemoTable1415 (
-> ProductPurchaseDate date,
-> ProductPrice int
-> );
Query OK, 0 rows affected (0.53 sec)
mysql> insert into DemoTable1415 values('2019-01-12', 560);
mysql> insert into DemoTable1415 values('2018-01-14', 1060);
mysql> insert into DemoTable1415 values('2017-03-21', 780);
mysql> insert into DemoTable1415 values('2016-09-01', 800);
mysql> insert into DemoTable1415 values('2019-01-14', 100);
ข้อมูลทั้งหมด
+---------------------+--------------+ | ProductPurchaseDate | ProductPrice | +---------------------+--------------+ | 2019-01-12 | 560 | | 2018-01-14 | 1060 | | 2017-03-21 | 780 | | 2016-09-01 | 800 | | 2019-01-14 | 100 | +---------------------+--------------+
คำสั่ง GROUP BY EXTRACT(MONTH)
mysql> select extract(MONTH from ProductPurchaseDate) as month,
-> sum(ProductPrice) as total_value
-> from DemoTable1415
-> group by month;
ผลลัพธ์
+-------+-------------+ | month | total_value | +-------+-------------+ | 1 | 1720 | | 3 | 780 | | 9 | 800 | +-------+-------------+
อธิบาย
- เดือน 1 (มกราคม): 560 + 1060 + 100 = 1720 (รวมปี 2018, 2019)
- เดือน 3 (มีนาคม): 780 (ปี 2017)
- เดือน 9 (กันยายน): 800 (ปี 2016)
EXTRACT Units อื่นๆ
| Unit | คำอธิบาย | ตัวอย่างผลลัพธ์ |
|---|---|---|
MICROSECOND | ไมโครวินาที | 123456 |
SECOND | วินาที (0-59) | 30 |
MINUTE | นาที (0-59) | 45 |
HOUR | ชั่วโมง (0-23) | 14 |
DAY | วัน (1-31) | 20 |
WEEK | สัปดาห์ในปี (0-53) | 42 |
MONTH | เดือน (1-12) | 10 |
QUARTER | ไตรมาส (1-4) | 4 |
YEAR | ปี (4 หลัก) | 2019 |
YEAR_MONTH | ปีและเดือน | 201910 |
DAY_HOUR | วันและชั่วโมง | 2014 |
กรณีต้องการแยกปีด้วย (Year-Month)
SELECT EXTRACT(YEAR_MONTH FROM ProductPurchaseDate) AS year_month, SUM(ProductPrice) AS total_value FROM DemoTable1415 GROUP BY year_month;
ผลลัพธ์: 201901=660, 201801=1060, 201703=780, 201609=800
ประสิทธิภาพ: Index บน Date Column
สร้าง index บน ProductPurchaseDate — MySQL อาจใช้ Index สำหรับ GROUP BY (Loose Index Scan) หากไม่มี WHERE clause