4.1 การจัดกลุ่มคอลัมน์

สิ่งที่สำคัญมากก็คือ หากคุณจัดกลุ่มเรคคอร์ด ในส่วนนี้SELECTคุณสามารถระบุได้เฉพาะคอลัมน์ที่จัดกลุ่มข้อมูลเท่านั้น

คุณไม่ได้เขียนคิวรีประเภทและระบุSELECTคอลัมน์ชื่อ ในส่วน :

SELECT brand, name
FROM product
GROUP BY brand

คุณมีแถวหลายแถว ในตาราง ผลิตภัณฑ์ ที่มีฟิลด์ ชื่อและไม่ชัดเจนว่าคุณต้องแทนที่แถวใด ลองคิดใหม่: คุณต้องการทราบจำนวนผลิตภัณฑ์ของแต่ละแบรนด์และตารางผลลัพธ์จะได้ชื่อผลิตภัณฑ์อย่างไร

หากคุณใช้ตัวดำเนินการGROUP BYแถวปกติจะไม่สามารถเข้าไปในผลลัพธ์ของคุณได้ แต่จะมีเพียงคอลัมน์ที่ข้อมูลถูกจัดกลุ่มและ "คอลัมน์จากการคำนวณ" เช่นCOUNT(*)

4.2 การจัดกลุ่มตามคอลัมน์จากการคำนวณ

แต่คุณสามารถจัดกลุ่มตามหลายคอลัมน์และแม้กระทั่งตามคอลัมน์จากการคำนวณ ตัวอย่าง:

SELECT
YEAR(join_date) AS hire_year,
COUNT(*) AS total
FROM employee
GROUP BY hire_year

และผลลัพธ์ของแบบสอบถามนี้:

จ้าง_ปี ทั้งหมด
2555 1
2556 1
2557 1
2558 2
2561 1

มาวิเคราะห์คำขอของเรากัน

ใน ตาราง พนักงานพนักงานแต่ละคนมีวันที่จ้างงานที่ไม่ซ้ำกัน ดังนั้นการจัดกลุ่มข้อมูลตามตารางจะไม่ทำงาน - จะมีหนึ่งบันทึกสำหรับแต่ละวันและการจัดกลุ่มจะไม่สมเหตุสมผลมากนัก แต่ถ้าเราย้ายจากวันที่จ้างไปยังปีที่จ้าง อาจเป็นสถานการณ์ที่บริษัทจ้างพนักงานหลายคนในปีเดียวกัน

เรามาดูกันอีกครั้งว่าตารางนี้จะมีลักษณะอย่างไรก่อนที่จะจัดกลุ่ม:

SELECT
 	id,
 	name,
 	YEAR(join_date) AS hire_year,
 	join_date
FROM employee

และผลลัพธ์ของแบบสอบถามนี้:

รหัส ชื่อ จ้าง_ปี เข้าร่วม_วันที่
1 อีวานอฟ อีวาน 2555 2555-06-30
2 เปตรอฟ เปตรอฟ 2556 2013-08-12
3 อีวานอฟ เซอร์เกย์ 2557 2014-01-01
4 ราบิโนวิช มอยชา 2558 2015-05-12
5 คิเรียนโก อนาสตาเซีย 2558 2015-10-10
6 วาสก้า 2561 2018-11-11

แต่ตารางผลลัพธ์นี้สามารถจัดกลุ่มตามHire_yearและค้นหาจำนวนคนที่ได้รับการว่าจ้างในปีหนึ่งๆ

4.3 การจัดกลุ่มตามหลายคอลัมน์

ทีนี้ลองมาดูว่าในแต่ละเดือนของปีนั้นเราจ้างพนักงานกี่คน ในการดำเนินการนี้ เราจำเป็นต้องเพิ่มฟิลด์ที่คำนวณแล้วไม่ใช่หนึ่งฟิลด์ แต่เพิ่มสองฟิลด์ในแบบสอบถามพร้อมกัน - ปีที่จ้าง (hire_year) และเดือนที่จ้าง (hire_month)

ลองเขียนแบบสอบถามดังนี้:

SELECT
 	id,
 	name,
 	YEAR(join_date) AS hire_year,
 	MONTH(join_date) AS hire_month,
 	join_date
FROM employee

และผลลัพธ์ของแบบสอบถามนี้:

รหัส ชื่อ จ้าง_ปี จ้าง_เดือน เข้าร่วม_วันที่
1 อีวานอฟ อีวาน 2555 6 2555-06-30
2 เปตรอฟ เปตรอฟ 2556 8 2013-08-12
3 อีวานอฟ เซอร์เกย์ 2557 1 2014-01-01
4 ราบิโนวิช มอยชา 2558 5 2015-05-12
5 คิเรียนโก อนาสตาเซีย 2558 10 2015-10-10
6 วาสก้า 2561 สิบเอ็ด 2018-11-11

หากเราจัดกลุ่มข้อมูลในตารางผลลัพธ์นี้ตามเดือน เราจะจัดกลุ่มบุคคลออกเป็นกลุ่มๆ โดยไม่คำนึงว่าพวกเขาได้รับการว่าจ้างในปีใด และเราต้องการให้ตารางผลลัพธ์มีสามคอลัมน์: ปี เดือน และจำนวนพนักงานที่ได้รับการว่าจ้าง

ในการทำเช่นนี้หลังจากตัวดำเนินการGROUP BYคุณต้องใช้ชื่อไม่ใช่หนึ่งคอลัมน์ แต่เป็นสองคอลัมน์ ตัวอย่าง:

SELECT
 	YEAR(join_date) AS hire_year,
 	MONTH(join_date) AS hire_month,
 	COUNT(*) AS total
FROM employee
GROUP BY hire_year, hire_month

และผลลัพธ์ของแบบสอบถามนี้:

จ้าง_ปี จ้าง_เดือน ทั้งหมด
2555 6 1
2556 8 1
2557 1 1
2558 5 1
2558 10 1
2561 สิบเอ็ด 1

เรามีระเบียนไม่กี่รายการในตาราง ดังนั้นจึงมีหน่วยอยู่ทุกหนทุกแห่งในคอลัมน์ผลรวม และอีกอย่าง โปรดทราบว่ายิ่งเราจัดกลุ่มคอลัมน์มากเท่าไหร่ เราก็มีแถวในผลลัพธ์มากขึ้นเท่านั้น