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