Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> MySQL

การนับค่ามากกว่าและน้อยกว่าเฉพาะจำนวน แสดงในคอลัมน์แยกกันใน MySQL

ใช้ COUNT() ร่วมกับ CASE WHEN เพื่อนับจำนวนค่าที่มากกว่าและน้อยกว่าเกณฑ์ที่กำหนด แสดงในคอลัมน์แยกกัน

สร้างตารางตัวอย่าง

mysql> create table DemoTable ( 
    Score int ); 
Query OK, 0 rows affected (0.71 sec)

เพิ่มข้อมูลตัวอย่าง

mysql> insert into DemoTable values(40); Query OK, 1 row affected (0.77 sec)
mysql> insert into DemoTable values(48); Query OK, 1 row affected (0.12 sec)
mysql> insert into DemoTable values(59); Query OK, 1 row affected (0.10 sec)
mysql> insert into DemoTable values(33); Query OK, 1 row affected (0.20 sec)
mysql> insert into DemoTable values(38); Query OK, 1 row affected (0.09 sec)
mysql> insert into DemoTable values(89); Query OK, 1 row affected (0.11 sec)
mysql> insert into DemoTable values(35); Query OK, 1 row affected (0.12 sec)

แสดงข้อมูลทั้งหมด

mysql> select *from DemoTable;
+-------+
| Score |
+-------+
|    40 |
|    48 |
|    59 |
|    33 |
|    38 |
|    89 |
|    35 |
+-------+
7 rows in set (0.00 sec)

คิวรี่นับค่า > 45 และ ≤ 45 แสดงคอลัมน์แยกกัน

mysql> select count( case when Score > 45 then 1 end) as CountOfValueGreaterThan45, 
    count( case when Score <= 45 then 1 end) as CountOfValueLessThanOrEqualTo45 
    from DemoTable;

ผลลัพธ์:

+---------------------------+---------------------------------+
| CountOfValueGreaterThan45 | CountOfValueLessThanOrEqualTo45 |
+---------------------------+---------------------------------+
|                         3 |                               4 |
+---------------------------+---------------------------------+
1 row in set (0.00 sec)

คำอธิบาย

  • CASE WHEN Score > 45 THEN 1 END คืนค่า 1 เมื่อตรงเงื่อนไข, NULL เมื่อไม่ตรง
  • COUNT() นับเฉพาะค่า non-NULL ดังนั้นนับได้เฉพาะที่ตรงเงื่อนไข
  • สามารถใช้ SUM(CASE WHEN ... THEN 1 ELSE 0 END) ได้เช่นกัน

ขยายเป็นหลายช่วง (Bucketing)

SELECT 
    COUNT(CASE WHEN Score < 40 THEN 1 END) as 'Below 40',
    COUNT(CASE WHEN Score BETWEEN 40 AND 59 THEN 1 END) as '40-59',
    COUNT(CASE WHEN Score BETWEEN 60 AND 79 THEN 1 END) as '60-79',
    COUNT(CASE WHEN Score >= 80 THEN 1 END) as '80+'
FROM DemoTable;

MySQL 8.0+: ใช้ Window Functions

SELECT 
    Score,
    COUNT(*) OVER (PARTITION BY CASE WHEN Score > 45 THEN 'High' ELSE 'Low' END) as cnt
FROM DemoTable;