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

หาผลรวมแต่ละคอลัมน์ใน MySQL ด้วย SUM() หลายคอลัมน์

เมื่อต้องการหาผลรวม (Sum) ของหลายคอลัมน์พร้อมกัน ให้ใช้ SUM() แยกคอลัมน์ด้วยจุลภาคในคำสั่ง SELECT เดียว

สร้างตารางและข้อมูล

mysql> create table DemoTable (
    Id int NOT NULL AUTO_INCREMENT PRIMARY KEY,
    FirstValue int, SecondValue int, ThirdValue int
);
mysql> insert into DemoTable(FirstValue,SecondValue,ThirdValue) values
(10,20,30),(60,50,40),(80,90,100),(20,10,0);

ข้อมูลในตาราง

+----+------------+-------------+------------+
| Id | FirstValue | SecondValue | ThirdValue |
+----+------------+-------------+------------+
| 1  | 10         | 20          | 30         |
| 2  | 60         | 50          | 40         |
| 3  | 80         | 90          | 100        |
| 4  | 20         | 10          | 0          |
+----+------------+-------------+------------+

คำสั่ง SUM หลายคอลัมน์

mysql> select sum(FirstValue), sum(SecondValue), sum(ThirdValue) from DemoTable;

ผลลัพธ์ (ทุกคอลัมน์รวม = 170)

+-----------------+------------------+-----------------+
| sum(FirstValue) | sum(SecondValue) | sum(ThirdValue) |
+-----------------+------------------+-----------------+
| 170             | 170              | 170             |
+-----------------+------------------+-----------------+

ขยาย: เพิ่ม Alias และ Aggregate อื่น

SELECT 
    SUM(FirstValue) AS sum_first,
    SUM(SecondValue) AS sum_second,
    SUM(ThirdValue) AS sum_third,
    AVG(FirstValue) AS avg_first,
    MIN(FirstValue) AS min_first,
    MAX(FirstValue) AS max_first,
    COUNT(*) AS row_count
FROM DemoTable;

NULL Handling

  • SUM() ข้าม NULL อัตโนมัติ (NULL + 10 = 10)
  • ถ้าทุกค่าเป็น NULL → SUM คืน NULL
  • ใช้ COALESCE(SUM(col), 0) เพื่อให้ได้ 0

Performance

  • Single Pass - MySQL อ่านตารางครั้งเดียว คำนวณ SUM ทุกคอลัมน์พร้อมกัน
  • เร็วกว่า SELECT SUM(col1) ... UNION SELECT SUM(col2) ... มาก
  • Index ไม่ช่วย SUM โดยตรง (Full Table Scan) แต่ช่วย WHERE

Window Function (MySQL 8.0+) - Running Total

SELECT 
    Id, FirstValue,
    SUM(FirstValue) OVER (ORDER BY Id) AS running_total
FROM DemoTable;