ในโลกของการวิเคราะห์ข้อมูล (Data Analytics) ข้อมูลมักจะถูกจัดเก็บในรูปแบบที่เหมาะสมกับการบันทึก (Normalized) ซึ่งหมายความว่าข้อมูลที่เกี่ยวข้องกับแต่ละรายการจะถูกแยกออกเป็นแถว (Rows) และคอลัมน์ (Columns) อย่างชัดเจน อย่างไรก็ตาม เมื่อเราต้องการนำข้อมูลไปแสดงผลหรือวิเคราะห์ในรูปแบบรายงาน (Reporting) บางครั้งเราจำเป็นต้องทำการ ‘สลับ’ โครงสร้างข้อมูล หรือที่เรียกว่า **Data Transposition** (การสลับแถวเป็นคอลัมน์ หรือคอลัมน์เป็นแถว)
การสลับตารางแนวนอน (Horizontal) และแนวตั้ง (Vertical) นี้เป็นทักษะสำคัญที่ Senior Data Architect ต้องรู้ เพื่อให้สามารถแปลงข้อมูลดิบให้อยู่ในรูปแบบที่พร้อมใช้งานสำหรับ Business Intelligence (BI) Tools หรือการแสดงผลใน Dashboard ได้อย่างมีประสิทธิภาพ บทความนี้จะเจาะลึกถึงวิธีการทำ Data Transposition โดยใช้คุณสมบัติขั้นสูงของระบบจัดการฐานข้อมูล PostgreSQL
💡 หลักการ Transpose ข้อมูลใน PostgreSQL
โดยพื้นฐานแล้ว PostgreSQL ไม่มีคำสั่ง `TRANSPOSE()` โดยตรงเหมือนในเครื่องมือ BI บางตัว แต่เราสามารถจำลองการทำงานนี้ได้โดยใช้เทคนิคที่เรียกว่า **Conditional Aggregation** ร่วมกับคำสั่ง `UNION ALL` หรือการใช้ `CASE` statements เพื่อเปลี่ยนค่าจากแถว (Row Value) ให้กลายเป็นคอลัมน์ (Column Header)
สมมติว่าเรามีตาราง `sales_data` ที่เก็บข้อมูลยอดขายรายเดือนในรูปแบบแนวตั้ง (Vertical) ซึ่งแต่ละแถวคือเดือน และแต่ละคอลัมน์คือข้อมูลที่แตกต่างกัน เราต้องการให้ข้อมูลเหล่านั้นถูกเปลี่ยนเป็นรูปแบบแนวนอน (Horizontal) เพื่อให้แต่ละเดือนเป็นคอลัมน์หลัก
ตัวอย่างการ Transpose ข้อมูล (Vertical to Horizontal)
พิจารณาตาราง `sales_data` ที่มีข้อมูลดังนี้:
- | Month | Product_A_Sales | Product_B_Sales |
- | Jan | 100 | 150 |
- | Feb | 120 | 180 |
หากเราต้องการให้ Month เป็นแถวหลัก และ Product_A_Sales, Product_B_Sales เป็นคอลัมน์ เราจะต้องใช้การ Pivot ข้อมูล:
SQL
-- 1. สร้างตารางตัวอย่าง (Source Data: Vertical Format) </code>
CREATE TABLE sales_data (
month VARCHAR(10),
product_a_sales INT,
product_b_sales INT
);
INSERT INTO sales_data (month, product_a_sales, product_b_sales) VALUES
('Jan', 100, 150),
('Feb', 120, 180);
-- 2. Query สำหรับ Transpose ข้อมูล (Pivot: Vertical to Horizontal) </code>
SELECT
month,
product_a_sales AS product_a_sales_jan,
product_b_sales AS product_b_sales_jan
FROM sales_data
WHERE month = 'Jan';
-- หากต้องการให้ทุกเดือนอยู่ในแถวเดียว (ต้องใช้ UNION ALL หรือ CASE/GROUP BY ร่วมกัน) </code>
SELECT
month,
MAX(CASE WHEN product_a_sales IS NOT NULL THEN product_a_sales END) AS product_a_sales,
MAX(CASE WHEN product_b_sales IS NOT NULL THEN product_b_sales END) AS product_b_sales
FROM sales_data
GROUP BY month;
🛠️ เทคนิคขั้นสูง: การใช้ CASE/GROUP BY สำหรับการ Pivot
ในกรณีที่ตารางมีจำนวนคอลัมน์ที่ต้อง Pivot มากกว่า 3-4 คอลัมน์ การใช้ `CASE` statement ร่วมกับ `GROUP BY` จะเป็นวิธีที่ยืดหยุ่นและเป็นมาตรฐานที่สุดในการจำลองการสลับโครงสร้างข้อมูล (Transposition) ใน PostgreSQL เนื่องจากเราสามารถกำหนดเงื่อนไข (Condition) เพื่อดึงค่าที่ต้องการมาแสดงในคอลัมน์ที่กำหนดได้อย่างแม่นยำ
✅ บทสรุป
การเข้าใจหลักการ Transposition Data เป็นหัวใจสำคัญของการเป็น System Specialist ที่สามารถออกแบบ Data Pipeline ได้อย่างสมบูรณ์ การสลับระหว่างโครงสร้างแนวตั้งและแนวนอนด้วย PostgreSQL ไม่ได้อาศัยคำสั่งเดียว แต่ต้องอาศัยการประยุกต์ใช้ฟังก์ชันเชิงตรรกะอย่าง `CASE` statement และการจัดกลุ่มด้วย `GROUP BY` เพื่อให้ได้ผลลัพธ์ที่ต้องการ
เมื่อคุณสามารถทำ Data Reshaping ได้อย่างเชี่ยวชาญ คุณจะไม่เพียงแค่เป็นนักเขียน SQL แต่ยังเป็นสถาปนิกข้อมูลที่สามารถเชื่อมโยงข้อมูลจากแหล่งที่มาที่แตกต่างกันให้กลายเป็นมุมมองเดียวที่พร้อมสำหรับการตัดสินใจทางธุรกิจได้อย่างแท้จริง