🇯🇵 日本語 | 🇺🇸 English | 🇪🇸 Español | 🇵🇹 Português | 🇹🇭 ไทย | 🇨🇳 中文

【บทช่วยสอนฟังก์ชัน SQL】มาเป็นเจ้าแห่งการรวมข้อมูลด้วย SUM, AVG, MAX, MIN!

ในการสร้างรายงานการขายของเว็บไซต์ ข้อมูลเช่น "ยอดขายรวมของเดือนนี้เท่าไหร่?", "ราคาเฉลี่ยของสินค้าคือเท่าไหร่?", "สินค้าที่ขายได้ราคาสูงสุดคืออะไร?" เป็นสิ่งที่ขาดไม่ได้ เมื่อคุณต้องการรวมข้อมูลแต่ละชิ้นที่เก็บไว้ในฐานข้อมูลให้เป็นตัวเลขที่มีความหมายเพียงตัวเดียว สิ่งที่จะแสดงพลังมหาศาลในตอนนั้นก็คือ ฟังก์ชันการรวมข้อมูล ของ SQL

ฟังก์ชันการรวมข้อมูลคือฟังก์ชันที่รับข้อมูลจากหลายๆ แถวเป็นอินพุต และส่งคืนค่าเดียวเป็นผลลัพธ์ของการรวมข้อมูลนั้น เปรียบเสมือนการนำกระดาษที่มีตัวเลขมากมายป้อนเข้าเครื่องคิดเลขเพื่อให้ได้คำตอบเดียวเช่น "ผลรวม" หรือ "ค่าเฉลี่ย"

ในบทความนี้ เราจะอธิบายวิธีการใช้งาน "จตุรเทพ" แห่งฟังก์ชันการรวมข้อมูลที่ใช้บ่อยที่สุดและเป็นพื้นฐานของการวิเคราะห์ข้อมูล ได้แก่ SUM(), AVG(), MAX(), และ MIN() อย่างละเอียดพร้อมโค้ดที่สามารถคัดลอกไปใช้ได้ทันที การฝึกฝนฟังก์ชันเหล่านี้และใช้ร่วมกับ `GROUP BY` จะช่วยเพิ่มความสามารถในการวิเคราะห์ข้อมูลของคุณได้อย่างก้าวกระโดด!


การเตรียมตัว: มาเตรียมข้อมูลยอดขายสำหรับใช้ในการรวมข้อมูลกัน

ในการทดลองใช้ฟังก์ชันการรวมข้อมูล เราจำเป็นต้องมีข้อมูลตัวเลขสำหรับใช้เป็นเป้าหมายก่อน ครั้งนี้ เราจะสร้างตาราง `sales` ที่จำลองประวัติการขายของเว็บไซต์ E-commerce การมีข้อมูลจากหลายหมวดหมู่และราคาและปริมาณที่แตกต่างกันจะช่วยให้เห็นการทำงานของแต่ละฟังก์ชันได้ชัดเจนยิ่งขึ้น

-- หากมีตาราง sales อยู่แล้วให้ลบออก (เพื่อให้สามารถทดสอบซ้ำได้)
DROP TABLE IF EXISTS sales;

-- สร้างตาราง sales ใหม่
CREATE TABLE sales (
  id INTEGER PRIMARY KEY,
  product_name TEXT NOT NULL,
  category TEXT NOT NULL,
  price INTEGER NOT NULL,
  quantity INTEGER NOT NULL,
  sale_date DATE NOT NULL
);

-- ใส่ข้อมูลเริ่มต้น
INSERT INTO sales (id, product_name, category, price, quantity, sale_date) VALUES
(1, 'ปากกาสุดเจ๋ง', 'เครื่องเขียน', 150, 10, '2025-07-01'),
(2, 'สมุดโน้ตเวทมนตร์', 'เครื่องเขียน', 300, 5, '2025-07-01'),
(3, 'หม้อหุงข้าวขั้นเทพ', 'เครื่องใช้ไฟฟ้า', 25000, 2, '2025-07-02'),
(4, 'แอปเปิ้ลมหัศจรรย์', 'อาหาร', 500, 20, '2025-07-03'),
(5, 'ฮับ USB-C', 'อุปกรณ์คอมพิวเตอร์', 4000, 3, '2025-07-03'),
(6, 'พู่กันโบราณ', 'เครื่องเขียน', 1200, 8, '2025-07-04'),
(7, 'ช็อกโกแลตพรีเมียม', 'อาหาร', 3500, 5, '2025-07-05'),
(8, 'ปากกาสุดเจ๋ง', 'เครื่องเขียน', 150, 15, '2025-07-05');

ตอนนี้เราพร้อมที่จะรวมข้อมูลจากมุมมองต่างๆ แล้ว


【ผลรวม】การหาผลรวมด้วยฟังก์ชัน `SUM()`

ฟังก์ชัน SUM() ใช้สำหรับคำนวณผลรวมของค่าในคอลัมน์ตัวเลขที่ระบุ เป็นหนึ่งในฟังก์ชันการรวมข้อมูลพื้นฐานที่สุดที่ใช้ในสถานการณ์ทางธุรกิจมากมายที่ต้องการทราบ "ผลรวม" เช่น "ยอดขายรวม", "จำนวนสินค้าคงคลังทั้งหมด", "คะแนนรวม"

ในวงเล็บของ SUM() ให้ระบุชื่อคอลัมน์ที่ต้องการหาผลรวม นอกจากนี้ยังสามารถรวมผลลัพธ์จากการคำนวณระหว่างคอลัมน์ได้อีกด้วย

สถานการณ์: "ยอดขายทั้งหมด (รายได้รวม) เป็นเท่าใด?"

ในกรณีนี้ เราจะคำนวณ "ราคา (price) × ปริมาณ (quantity)" ของแต่ละระเบียน แล้วนำผลลัพธ์ทั้งหมดมารวมกัน

SELECT SUM(price * quantity) AS total_revenue FROM sales;

ผลลัพธ์:

total_revenue
-------------
102850

การใช้ AS total_revenue เพื่อตั้งชื่อที่เข้าใจง่ายให้กับคอลัมน์ผลลัพธ์ว่า "รายได้รวม" ก็เป็นอีกหนึ่งจุดสำคัญ


【ค่าเฉลี่ย】การหาค่าเฉลี่ยด้วยฟังก์ชัน `AVG()`

ฟังก์ชัน AVG() (ย่อมาจาก Average) ใช้สำหรับคำนวณค่าเฉลี่ยของคอลัมน์ตัวเลขที่ระบุ มีประโยชน์ในการทำความเข้าใจแนวโน้มโดยรวมของข้อมูล เช่น "อายุเฉลี่ย", "คะแนนเฉลี่ย", "ราคาต่อหน่วยเฉลี่ย"

สถานการณ์: "ราคาต่อหน่วยโดยเฉลี่ยของสินค้าที่ขายไปคือเท่าไหร่?"

SELECT AVG(price) AS average_price FROM sales;

ผลลัพธ์:

average_price
-------------
5562.5

ข้อควรระวังคือ หากคอลัมน์ที่ใช้คำนวณมีค่า `NULL` อยู่, `SUM()` และ `AVG()` จะไม่นำแถวนั้นมารวมในการคำนวณ ซึ่งอาจทำให้ได้ผลลัพธ์ที่ไม่คาดคิดได้ ดังนั้นควรจำไว้


【ค่าสูงสุดและต่ำสุด】การหาค่าสูงสุดและต่ำสุดด้วยฟังก์ชัน `MAX()` และ `MIN()`

MAX() (Maximum) และ MIN() (Minimum) ตามชื่อเลย คือฟังก์ชันสำหรับดึงค่าสูงสุดและต่ำสุดภายในคอลัมน์ การเรียนรู้ทั้งสองฟังก์ชันนี้ไปพร้อมกันจะช่วยให้มีประสิทธิภาพมากขึ้น

ฟังก์ชัน `MAX()`: การค้นหาค่าที่มากที่สุด

สถานการณ์: "ยอดขายสูงสุดในการซื้อขายครั้งเดียวคือเท่าไหร่?"

SELECT MAX(price * quantity) AS highest_sale FROM sales;

ผลลัพธ์:

highest_sale
------------
50000

นี่คือยอดขายของ "หม้อหุงข้าวขั้นเทพ" ที่มี ID 3 (25,000 × 2)


ฟังก์ชัน `MIN()`: การค้นหาค่าที่น้อยที่สุด

สถานการณ์: "ในบรรดาสินค้าที่ขายไป ราคาต่อหน่วยที่ถูกที่สุดคือเท่าไหร่?"

SELECT MIN(price) AS cheapest_price FROM sales;

ผลลัพธ์:

cheapest_price
--------------
150

`MAX()` และ `MIN()` ไม่เพียงแต่ใช้กับตัวเลขได้เท่านั้น แต่ยังสามารถใช้กับวันที่ (วันที่ใหม่สุด/เก่าสุด) และสตริง (เรียงตามพจนานุกรมตัวสุดท้าย/ตัวแรก) ได้อีกด้วย ทำให้เป็นฟังก์ชันที่มีประโยชน์หลากหลายมาก


【การผสมผสานที่ทรงพลังที่สุด】`GROUP BY` Clause และฟังก์ชันการรวมข้อมูล

พลังที่แท้จริงของฟังก์ชันการรวมข้อมูลทั้งสี่นี้จะแสดงออกมาอย่างเต็มที่เมื่อใช้ร่วมกับ `GROUP BY` clause การใช้ `GROUP BY` ช่วยให้คุณสามารถจัดกลุ่มข้อมูลตามค่าในคอลัมน์ที่ระบุ แล้วนำฟังก์ชันการรวมข้อมูลไปใช้กับ**แต่ละกลุ่ม**ได้

ทำให้สามารถทำการวิเคราะห์ที่ละเอียดและนำไปใช้ได้จริงมากขึ้น เช่น "ยอดขายรวมตามหมวดหมู่" หรือ "จำนวนขายเฉลี่ยต่อสินค้า"

สถานการณ์: "ต้องการรวมยอดขายรวม, ราคาต่อหน่วยเฉลี่ย, และจำนวนขายทั้งหมด ตามหมวดหมู่สินค้า"

SELECT
  category,
  SUM(price * quantity) AS total_revenue,
  AVG(price) AS average_price,
  SUM(quantity) AS total_quantity_sold
FROM
  sales
GROUP BY
  category;

ผลลัพธ์:

category           | total_revenue | average_price | total_quantity_sold
-------------------|---------------|---------------|---------------------
อุปกรณ์คอมพิวเตอร์ | 12000         | 4000          | 3
เครื่องใช้ไฟฟ้า      | 50000         | 25000         | 2
เครื่องเขียน       | 13350         | 550           | 33
อาหาร             | 27500         | 2000          | 25

ด้วยคำสั่งเดียวนี้ ผลการดำเนินงานการขายโดยละเอียดของแต่ละหมวดหมู่ก็ชัดเจนในทันที การรวมฟังก์ชันการรวมข้อมูลกับ `GROUP BY` เช่นนี้ ช่วยให้คุณสามารถดึง "ข้อมูลเชิงลึก" ที่เป็นประโยชน์ต่อธุรกิจออกมาจากข้อมูลดิบที่เคยเป็นเพียงรายการตัวเลขได้


【สนามเด็กเล่นแบบโต้ตอบ】มาสัมผัสประสบการณ์การรวมข้อมูลโดยการรัน SQL ในเบราว์เซอร์ของคุณ!

ถึงเวลาเปลี่ยนความรู้ให้เป็นทักษะแล้ว! คัดลอกโค้ด HTML ทั้งหมดด้านล่าง, บันทึกเป็นไฟล์ชื่อ sql_aggregate_test.html, และเปิดในเบราว์เซอร์ของคุณ สภาพแวดล้อม SQL ส่วนตัวของคุณจะเปิดขึ้นมา พร้อมกับตาราง sales ที่เราใช้ในบทความนี้

ลองเปลี่ยน `SUM` เป็น `AVG` หรือเปลี่ยนคอลัมน์ที่จะเพิ่มใน `GROUP BY` และทดลองอย่างอิสระเพื่อดูว่าข้อมูลถูกรวมและเปลี่ยนเป็นข้อมูลที่มีความหมายได้อย่างไรด้วยตาของคุณเอง!

<!DOCTYPE html>
<html lang="th">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>สนามเด็กเล่นออนไลน์สำหรับฟังก์ชันการรวมข้อมูล SQL</title>
  <style>
    body { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif; line-height: 1.7; color: #333; max-width: 800px; margin: 2rem auto; padding: 0 1rem; }
    h1 { color: #2980b9; }
    textarea { width: 100%; height: 220px; font-family: "SF Mono", "Consolas", monospace; font-size: 16px; padding: 12px; border: 1px solid #ccc; border-radius: 6px; box-sizing: border-box; margin-bottom: 1rem; }
    button { background-color: #3498db; color: white; border: none; padding: 12px 22px; font-size: 16px; border-radius: 6px; cursor: pointer; transition: background-color 0.2s; }
    button:hover { background-color: #2980b9; }
    button:disabled { background-color: #bdc3c7; cursor: not-allowed; }
    #result-container { margin-top: 2rem; border: 1px solid #ddd; padding: 1rem; border-radius: 6px; background: #fdfdfd; min-height: 50px; }
    #error-message { color: #e74c3c; font-weight: bold; }
    table { border-collapse: collapse; width: 100%; margin-top: 1rem; }
    th, td { border: 1px solid #ddd; padding: 10px; text-align: left; }
    th { background-color: #f2f2f2; }
    tr:nth-child(even) { background-color: #f9f9f9; }
  </style>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/sql.js/1.10.3/sql-wasm.js"></script>
</head>
<body>

  <h1>มาลองใช้ SQL กัน!</h1>
  <p>ป้อนคำสั่ง SQL ในช่องข้อความด้านล่างแล้วคลิกปุ่ม "ประมวลผล" มาลองรวมข้อมูลแบบต่างๆ กัน!</p>

  <textarea id="sql-input">-- ลองจัดกลุ่มตามชื่อสินค้า แล้วคำนวณยอดขายรวมและจำนวนขายทั้งหมดของแต่ละสินค้า
SELECT
  product_name,
  SUM(price * quantity) AS total_revenue,
  SUM(quantity) AS total_quantity
FROM
  sales
GROUP BY
  product_name
ORDER BY
  total_revenue DESC;
  </textarea>
  
  <button id="execute-btn">ประมวลผล</button>
  
  <div id="result-container">
    <p id="error-message"></p>
    <div id="result-output"></div>
  </div>

  <script>
    const sqlInput = document.getElementById('sql-input');
    const executeBtn = document.getElementById('execute-btn');
    const errorMsg = document.getElementById('error-message');
    const resultOutput = document.getElementById('result-output');

    let db;

    async function initDb() {
      executeBtn.disabled = true;
      executeBtn.textContent = 'กำลังเตรียมฐานข้อมูล...';
      try {
        const SQL = await initSqlJs({
          locateFile: file => `https://cdnjs.cloudflare.com/ajax/libs/sql.js/1.10.3/${file}`
        });
        db = new SQL.Database();
        
        const setupSql = `
          DROP TABLE IF EXISTS sales;
          CREATE TABLE sales (id INTEGER PRIMARY KEY, product_name TEXT NOT NULL, category TEXT NOT NULL, price INTEGER NOT NULL, quantity INTEGER NOT NULL, sale_date DATE NOT NULL);
          INSERT INTO sales (id, product_name, category, price, quantity, sale_date) VALUES
          (1, 'ปากกาสุดเจ๋ง', 'เครื่องเขียน', 150, 10, '2025-07-01'),
          (2, 'สมุดโน้ตเวทมนตร์', 'เครื่องเขียน', 300, 5, '2025-07-01'),
          (3, 'หม้อหุงข้าวขั้นเทพ', 'เครื่องใช้ไฟฟ้า', 25000, 2, '2025-07-02'),
          (4, 'แอปเปิ้ลมหัศจรรย์', 'อาหาร', 500, 20, '2025-07-03'),
          (5, 'ฮับ USB-C', 'อุปกรณ์คอมพิวเตอร์', 4000, 3, '2025-07-03'),
          (6, 'พู่กันโบราณ', 'เครื่องเขียน', 1200, 8, '2025-07-04'),
          (7, 'ช็อกโกแลตพรีเมียม', 'อาหาร', 3500, 5, '2025-07-05'),
          (8, 'ปากกาสุดเจ๋ง', 'เครื่องเขียน', 150, 15, '2025-07-05');
        `;
        db.run(setupSql);
        
        executeBtn.disabled = false;
        executeBtn.textContent = 'ประมวลผล';
        resultOutput.innerHTML = '<p>พร้อมแล้ว! คุณสามารถทดลองใช้คำสั่ง SQL ของคุณเองได้เลย</p>';

      } catch (err) {
        errorMsg.textContent = 'การเริ่มต้นฐานข้อมูลล้มเหลว: ' + err.message;
        console.error(err);
      }
    }

    function executeSql() {
      if (!db) return;
      
      const sql = sqlInput.value;
      errorMsg.textContent = '';
      resultOutput.innerHTML = '';

      try {
        const results = db.exec(sql);
        if (results.length === 0) {
          resultOutput.innerHTML = '<p>คำสั่งสำเร็จ แต่ไม่มีผลลัพธ์ส่งกลับมา</p>';
          return;
        }
        
        results.forEach(result => {
          const table = document.createElement('table');
          const thead = document.createElement('thead');
          const tbody = document.createElement('tbody');
          
          const headerRow = document.createElement('tr');
          result.columns.forEach(colName => {
            const th = document.createElement('th');
            th.textContent = colName;
            headerRow.appendChild(th);
          });
          thead.appendChild(headerRow);
          
          result.values.forEach(row => {
            const bodyRow = document.createElement('tr');
            row.forEach(cellValue => {
              const td = document.createElement('td');
              td.textContent = cellValue === null ? 'NULL' : (typeof cellValue === 'number' ? cellValue.toLocaleString() : cellValue);
              bodyRow.appendChild(td);
            });
            tbody.appendChild(bodyRow);
          });
          
          table.appendChild(thead);
          table.appendChild(tbody);
          resultOutput.appendChild(table);
        });

      } catch (err) {
        errorMsg.textContent = 'เกิดข้อผิดพลาด SQL: ' + err.message;
        console.error(err);
      }
    }

    executeBtn.addEventListener('click', executeSql);
    
    initDb();
  </script>
</body>
</html>

สรุป

ในบทความนี้ เราได้เรียนรู้เกี่ยวกับฟังก์ชันการรวมข้อมูลพื้นฐาน 4 ฟังก์ชันสำหรับการวิเคราะห์ข้อมูล ได้แก่ `SUM()`, `AVG()`, `MAX()`, และ `MIN()`

ฟังก์ชันการรวมข้อมูลเหล่านี้เป็นก้าวแรกที่ไม่ใช่แค่การดึงข้อมูล แต่เป็นการได้มาซึ่งข้อมูลเชิงลึกที่มีความหมายจากข้อมูล เป็นเครื่องมือที่ทรงพลังอย่างยิ่งสำหรับนักสร้างสรรค์เว็บ มีประโยชน์สำหรับทุกอย่างตั้งแต่การตัดสินใจทางธุรกิจไปจนถึงการระบุจุดที่ต้องปรับปรุงเว็บไซต์ เราขอแนะนำให้คุณฝึกฝนฟังก์ชันเหล่านี้ให้เชี่ยวชาญและสัมผัสกับความสุขในการสนทนากับข้อมูลของคุณ!