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