22 April 2019

คำสั่ง sql นับจำนวน Record ในฐานข้อมูล แยก ตาม field Date

เกริ่นนำก่อนนะครับ
พอดีผมมีฐานข้อมูล ที่มีการเก็บ รายละเอียดของข้อมูลโดยแต่ละ Record ถือเป็นข้อมูล 1 รายการ
และมีปัญหาว่า ผมไม่ได้เขียนโปรแกรมไว้สำหรับ ออกรายงาน เกี่ยวกับการนับจำนวนแยกตามเดือน
จึงได้ลองหา คำสั่ง sql เพื่อกรอง ข้อมูล สำหรับ ใช้งาน เฉพาะเป็นครั้งๆไป

Table ตัวอย่างนะครับ

id  |   end_date     | print  | note
------------------------------------
01 |  2018-01-01  |    1    | Null
02 |  2018-02-01  |    1    | Null
03 |  2018-03-01  |    1    | Null
04 |  2018-04-01  |    1    | Null
05 |  2018-05-01  |    1    | Null
06 |  2018-06-01  |    1    | Null
07 |  2018-07-01  |    1    | Null


ในที่นี้เราจะใช้คำสั่ง

SELECT DAY(Column)
SELECT MONTH(Column)
SELECT YEAR(Column)
ไว้เพื่อ กรุ๊ป วันเดือนปี ในที่นี้ ผมต้องการรวมแยกตามเดือน ก็เอามาแค่ เดือนกับปี

และจะใช้คำสั่ง count(Column) และ Group By เพื่อให้ผลของ sql ที่เรา query โชว์รายละเอียดเพิ่มเติ่มให้เราเห็นด้วย

SELECT year(end_date),month(end_date),count(id) FROM logs WHERE YEAR(end_date) = 2018 or year(end_date) = 2019 group by year(end_date),MONTH(end_date)

จากคำสั่ง sql นี้ ผมต้องการ field year,month,และให้ count field id เพื่อนับ
ส่วนเงื่อนไขก็คือ ให้ เอา ปี 2018 และ ปี 2019
โดยให้ จัดกลุ่มตาม ปี ตามด้วย เดือน

ผลลัพท์ที่ได้


year(end_date)month(end_date)count(id)
201814645
201823437
201834443
201843730
201853194
201863360
201873757
201888525
201899956
2018109509
2018119368
2018126282
2019110625
201928720
201939381
201946193

ตัวอย่างที่สองครับ แยกข้อมูลตามวันของเดือนนั้นๆ

SELECT year(end_date),month(end_date),day(end_date),count(id) FROM logs WHERE YEAR(end_date) = 2018 AND month(end_date) = 08 group by year(end_date),MONTH(end_date),day(end_date)

ผลลัพธ์ที่ได้


year(end_date)month(end_date)day(end_date)count(id)
201881216
201882221
201883258
201884278
201885154
201886302
201887258
201888233
201889357
2018810341
2018811193
201881256
2018813101
2018814320
2018815272
2018816308
2018817331
2018818257
2018819183
2018820322
2018821304
2018822303
2018823353
2018824333
2018825321
2018826236
2018827384
2018828328
2018829328
2018830330
2018831344


สำหรับใครที่มีปัญหาคล้ายๆผมก็ลองเอาไปประยุคใช้กันนะครับ