PlusMagi's Blog By Pitt Phunsanit Database HTML: สลับตารางแนวนอนและตารางแนวตั้งสมจริง

HTML: สลับตารางแนวนอนและตารางแนวตั้งสมจริง

ในโลกของการจัดการฐานข้อมูล (Database Management) ข้อมูลมักถูกจัดเก็บในรูปแบบที่เหมาะสมกับการใช้งานในแต่ละบริบท การแปลงโครงสร้างข้อมูลจากรูปแบบตารางแนวนอน (Wide Format) ไปเป็นแนวตั้ง (Long Format) หรือในทางกลับกัน คือกระบวนการที่เรียกว่า **Pivoting** และ **Unpivoting** ซึ่งเป็นทักษะสำคัญที่ Senior Data Architect ทุกคนต้องเชี่ยวชาญ

หากคุณกำลังทำงานกับข้อมูลในระบบที่ใช้ **PostgreSQL** การทำ Matrix Reshaping นี้สามารถทำได้อย่างมีประสิทธิภาพสูง โดยไม่จำเป็นต้องพึ่งพาเครื่องมือภายนอก แต่ใช้พลังของคำสั่ง SQL และฟังก์ชันเฉพาะทางของ PostgreSQL แทน

💡 หลักการแปลงตาราง (Pivoting & Unpivoting) ใน PostgreSQL

การแปลงตารางใน PostgreSQL โดยพื้นฐานแล้วคือการเปลี่ยนมุมมองของข้อมูล (View) ไม่ใช่การเปลี่ยนโครงสร้างทางกายภาพ (Physical Schema) การทำ Pivot คือการเปลี่ยนแถว (Row) ให้เป็นคอลัมน์ (Column) และ Unpivot คือการเปลี่ยนคอลัมน์ให้เป็นแถว

1. การทำ Pivot (Row to Column)

เมื่อคุณมีข้อมูลที่เก็บค่าต่างๆ ในแต่ละแถว (เช่น คะแนนของนักเรียนในวิชา A, B, C) แต่ต้องการให้แสดงเป็นคอลัมน์แยกกัน (Student | Score_A | Score_B | Score_C) เราจะใช้คำสั่ง SELECT ร่วมกับ CASE statement ซึ่งเป็นวิธีมาตรฐานและมีประสิทธิภาพที่สุดในการจำลองการ Pivot ใน SQL:

SQL

-- สมมติว่าเรามีตาราง 'student_scores' ที่เก็บข้อมูลในรูปแบบ Long Format (แนวตั้ง) -- (student_id, subject, score) -- เป้าหมาย: แปลงเป็น Wide Format (แนวนอน) SELECT student_id, MAX(CASE WHEN subject = 'Math' THEN score END) AS math_score, MAX(CASE WHEN subject = 'Science' THEN score END) AS science_score FROM student_scores GROUP BY student_id;

คำอธิบาย: เราใช้ CASE WHEN เพื่อตรวจสอบค่าในคอลัมน์ subject และใช้ MAX() ร่วมกับ GROUP BY เพื่อดึงค่า score ที่เกี่ยวข้องมาแสดงในคอลัมน์ใหม่ตามชื่อวิชาที่ต้องการ

2. การทำ Unpivot (Column to Row)

ในทางกลับกัน หากคุณมีตารางในรูปแบบ Wide Format (เช่น คะแนนของนักเรียน 3 วิชาแยกคอลัมน์) แต่ต้องการรวมข้อมูลทั้งหมดให้อยู่ในรูปแบบ Long Format (เพื่อการวิเคราะห์ที่ง่ายขึ้น) คุณสามารถใช้เทคนิคการรวมข้อมูล (UNION ALL) หรือใช้ฟังก์ชันที่ซับซ้อนขึ้น เช่น jsonb หรือ LATERAL JOIN ในการ Unnest ข้อมูล:

SQL

-- สมมติว่าเรามีตาราง 'student_wide' (student_id, math_score, science_score) -- เป้าหมาย: แปลงเป็น Long Format (แนวตั้ง) SELECT s.student_id, 'Math' AS subject, s.math_score AS score FROM student_wide s WHERE s.math_score IS NOT NULL UNION ALL SELECT s.student_id, 'Science' AS subject, s.science_score FROM student_wide s WHERE s.science_score IS NOT NULL;

คำอธิบาย: การใช้ UNION ALL เป็นวิธีที่ตรงไปตรงมาที่สุดในการ Unpivot ข้อมูล โดยการเลือกข้อมูลจากแต่ละคอลัมน์แยกกัน แล้วรวมผลลัพธ์ให้เป็นชุดข้อมูลเดียวที่มีคอลัมน์ Subject และ Score

🚀 บทสรุปสำหรับ System Architect

การเข้าใจหลักการ Pivot และ Unpivot ไม่ได้เป็นเพียงแค่การเขียน SQL แต่เป็นการเข้าใจถึงการออกแบบโมเดลข้อมูล (Data Modeling) ที่ถูกต้อง เมื่อคุณสามารถแปลงข้อมูลระหว่างรูปแบบแนวนอนและแนวตั้งได้อย่างคล่องแคล่วด้วย PostgreSQL คุณจะสามารถสร้างระบบรายงาน (Reporting System) และ Data Warehouse ที่มีความยืดหยุ่นสูง รองรับการวิเคราะห์ข้อมูลได้ทุกรูปแบบ ไม่ว่าข้อมูลต้นทางจะถูกจัดเก็บอย่างไรก็ตาม