【บทช่วยสอนฟังก์ชัน 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()`
- `SUM()`: คำนวณผลรวมของค่าตัวเลข ใช้สำหรับ "ยอดขายรวม", "ปริมาณรวม" เป็นต้น
- `AVG()`: คำนวณค่าเฉลี่ยของค่าตัวเลข ใช้สำหรับ "ราคาเฉลี่ย", "คะแนนเฉลี่ย" เป็นต้น
- `MAX()`: ค้นหาค่าสูงสุดในบรรดาตัวเลข, วันที่, ฯลฯ ใช้สำหรับ "ราคาสูงสุด", "วันที่ล่าสุด" เป็นต้น
- `MIN()`: ค้นหาค่าต่ำสุดในบรรดาตัวเลข, วันที่, ฯลฯ ใช้สำหรับ "ราคาต่ำสุด", "วันที่เก่าที่สุด" เป็นต้น
- อาวุธสุดยอด `GROUP BY`: ฟังก์ชันการรวมข้อมูลเหล่านี้จะแสดงพลังที่แท้จริงเมื่อใช้ร่วมกับ
GROUP BYclause ซึ่งทำให้สามารถรวมข้อมูลสำหรับแต่ละกลุ่มได้ - ข้อควรระวัง: ฟังก์ชันการรวมข้อมูลเหล่านี้จะไม่รวมค่า `NULL` ในการคำนวณ
ฟังก์ชันการรวมข้อมูลเหล่านี้เป็นก้าวแรกที่ไม่ใช่แค่การดึงข้อมูล แต่เป็นการได้มาซึ่งข้อมูลเชิงลึกที่มีความหมายจากข้อมูล เป็นเครื่องมือที่ทรงพลังอย่างยิ่งสำหรับนักสร้างสรรค์เว็บ มีประโยชน์สำหรับทุกอย่างตั้งแต่การตัดสินใจทางธุรกิจไปจนถึงการระบุจุดที่ต้องปรับปรุงเว็บไซต์ เราขอแนะนำให้คุณฝึกฝนฟังก์ชันเหล่านี้ให้เชี่ยวชาญและสัมผัสกับความสุขในการสนทนากับข้อมูลของคุณ!