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

นับจำนวนคอลัมน์ที่มีค่าเฉพาะใน MySQL

โจทย์: นับจำนวนคอลัมน์ที่มีค่า 1 ในแต่ละแถว

สมมติตารางมีคอลัมน์ value1, value2, value3 ที่เก็บค่า 0 หรือ 1 ต้องการทราบว่าแต่ละแถวมีค่า 1 กี่คอลัมน์

ไวยากรณ์ที่ใช้

SELECT 
    SUM(value1 + value2 + value3) AS Total_Number_Of_1,
    SUM(value1 AND value2 AND value3) AS Total_Rows_With_All_1
FROM yourTable;

ตัวอย่าง: ตาราง demo36

CREATE TABLE demo36 (
    id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    value1 INT, value2 INT, value3 INT
);

INSERT INTO demo36 (value1, value2, value3) VALUES
(1,0,0), (1,0,1), (1,1,1), (0,1,0), (1,1,0);

ข้อมูล

+----+--------+--------+--------+
| id | value1 | value2 | value3 |
+----+--------+--------+--------+
| 1  | 1      | 0      | 0      |
| 2  | 1      | 0      | 1      |
| 3  | 1      | 1      | 1      |
| 4  | 0      | 1      | 0      |
| 5  | 1      | 1      | 0      |
+----+--------+--------+--------+

คำสั่งและผลลัพธ์

SELECT 
    SUM(value1 + value2 + value3) AS Total_Number_Of_1,
    SUM(value1 AND value2 AND value3) AS Total_Rows_With_All_1
FROM demo36;
+-------------------+-----------------------+
| Total_Number_Of_1 | Total_Rows_With_All_1 |
+-------------------+-----------------------+
| 9                 | 1                     |
+-------------------+-----------------------+

คำอธิบาย

  • value1 + value2 + value3: บวกค่า 0/1 ในแต่ละแถว → ได้จำนวน 1 ต่อแถว (แถวที่ 1 = 1, แถวที่ 2 = 2, แถวที่ 3 = 3, ...)
  • SUM(...): รวมค่าทุกแถว → 1+2+3+1+2 = 9
  • value1 AND value2 AND value3: เป็น 1 ก็ต่อเมื่อทั้ง 3 คอลัมน์เป็น 1 (แถวที่ 3 เท่านั้น)
  • SUM(...): นับจำนวนแถวที่ทุกคอลัมน์เป็น 1 → 1 แถว

ขยายใช้งาน: นับต่อแถว (Per Row)

SELECT id,
       (value1 + value2 + value3) AS count_ones_per_row
FROM demo36;
+----+--------------------+
| id | count_ones_per_row |
+----+--------------------+
| 1  | 1                  |
| 2  | 2                  |
| 3  | 3                  |
| 4  | 1                  |
| 5  | 2                  |
+----+--------------------+

กรณีคอลัมน์เยอะ: ใช้ Dynamic SQL หรือ Application Layer

หากมีคอลัมน์มาก (10+ คอลัมน์) ให้สร้างคำสั่ง SQL ด้วยโปรแกรม หรือคำนวณใน Application Layer จะสะดวกกว่า