ทำไมต้องรู้จัก PIVOT และ UNPIVOT ในฐานข้อมูล
เวลาเราทำงานกับ Database (ฐานข้อมูลที่เก็บตารางข้อมูล) เรามักจะเจอกับข้อมูลที่ถูกเก็บไว้ในรูปแบบยาวเหยียด ซึ่งเรียกว่า Normalized Data (ข้อมูลที่ถูกจัดระเบียบให้ไม่ซ้ำซ้อน) ข้อมูลแบบนี้เหมาะกับการเก็บลงเครื่องคอมพิวเตอร์ แต่ไม่เหมาะกับการเอามาทำรายงานให้เจ้านายดู เพราะมันอ่านยากเกินไป
ลองนึกภาพตารางขายของที่มีคอลัมน์ชื่อเดือนและยอดขายเรียงกันลงมาเป็นร้อยแถว ถ้าเราอยากเห็นยอดขายแต่ละเดือนวางเรียงกันเป็นแถวเดียวในแนวนอนเพื่อให้เปรียบเทียบง่ายขึ้น เราต้องใช้คำสั่ง PIVOT (คำสั่งแปลงข้อมูลจากแนวตั้งให้เป็นแนวนอน) เพื่อจัดการเรื่องนี้โดยเฉพาะ
ในทางกลับกัน บางครั้งเราได้ไฟล์ Excel ที่สรุปมาแบบตารางสวยงามแล้ว แต่ระบบของเราต้องการข้อมูลแบบรายการเรียงลงมาเพื่อเอาไปประมวลผลต่อ เราก็ต้องใช้ UNPIVOT (คำสั่งแปลงข้อมูลจากแนวนอนให้เป็นแนวตั้ง) เพื่อเปลี่ยนโครงสร้างข้อมูลกลับมาให้เป็นรูปแบบที่โปรแกรมของเราทำงานได้ง่ายขึ้น
โครงสร้างข้อมูลก่อนทำ PIVOT
สมมติว่าเรามีตารางชื่อ SalesData ที่เก็บยอดขายของร้านค้า โดยมีคอลัมน์คือ Year (ปี), Product (ชื่อสินค้า) และ Amount (ยอดขาย) ข้อมูลในตารางจะถูกเก็บแบบรายการต่อรายการไล่ลงมาเรื่อยๆ ตามเวลาที่ขายได้จริง
การดูข้อมูลแบบนี้เหมาะสำหรับคอมพิวเตอร์เพราะมันเพิ่มข้อมูลได้ง่าย แต่ถ้าเราอยากรู้ว่าปี 2023 สินค้าแต่ละชนิดขายได้เท่าไหร่ เราจะมองด้วยตาเปล่าได้ยากมาก เพราะข้อมูลของสินค้าเดียวกันอาจจะกระจัดกระจายอยู่คนละบรรทัดกับปีอื่นๆ
ก่อนจะเริ่มใช้คำสั่ง PIVOT เราต้องเตรียมใจว่าเราต้องระบุคอลัมน์ที่เราต้องการจะ "ตั้งชื่อ" ให้แน่ชัด เพราะคำสั่งนี้จะเอาค่าในแถวมาเปลี่ยนเป็นชื่อคอลัมน์ใหม่ ถ้าเราไม่รู้ว่าข้อมูลมีอะไรบ้าง เราจะไม่สามารถเขียนคำสั่งให้ถูกต้องได้เลย
-- สร้างตารางข้อมูลตัวอย่าง
SELECT Year, Product, Amount
FROM SalesData;
-- ผลลัพธ์ที่ได้จะเป็นรายการเรียงลงมา เช่น
-- 2023, Apple, 100
-- 2023, Orange, 150
-- 2024, Apple, 200
คำสั่งข้างบนคือการ SELECT (ดึงข้อมูล) ปกติ เพื่อดูว่าข้อมูลดิบของเราหน้าตาเป็นอย่างไร บรรทัดที่ 2 คือการระบุคอลัมน์ที่ต้องการ และบรรทัดที่ 3 คือชื่อตารางที่เราดึงข้อมูลมาจากแหล่งเก็บข้อมูลจริง
วิธีใช้ PIVOT แปลงข้อมูลเป็นรายงาน
การใช้ PIVOT คือการบอกฐานข้อมูลว่า "เอาค่าในคอลัมน์นี้ มาทำเป็นหัวตารางใหม่นะ" โดยเราต้องใช้ฟังก์ชัน SUM (ฟังก์ชันรวมเลข) เพื่อบอกว่าถ้าเจอข้อมูลซ้ำกัน ให้เอาตัวเลขมาบวกกันไว้ในช่องนั้น
หลักการของมันคือการเลือกคอลัมน์ที่จะคงไว้เป็นแถว (ในที่นี้คือ Year) และเลือกคอลัมน์ที่จะเอาค่าข้างในมาทำเป็นหัวคอลัมน์ใหม่ (ในที่นี้คือ Product) จากนั้นให้เอาค่าตัวเลข Amount ไปใส่ไว้ในจุดตัดของแถวและคอลัมน์นั้น
มือใหม่มักพลาดตรงที่ลืมใส่ชื่อคอลัมน์ให้ครบในวงเล็บของ IN หรือสะกดชื่อสินค้าผิด ทำให้ผลลัพธ์ออกมาเป็นค่าว่าง (NULL) ทั้งที่จริงๆ แล้วควรจะมีตัวเลขแสดงอยู่ ต้องระวังเรื่องการพิมพ์ชื่อข้อมูลให้ตรงกับค่าจริงในตารางเสมอ
SELECT Year, [Apple], [Orange]
FROM (SELECT Year, Product, Amount FROM SalesData) AS SourceTable
PIVOT (
SUM(Amount)
FOR Product IN ([Apple], [Orange])
) AS PivotTable;
บรรทัดแรกคือการเลือกคอลัมน์ที่จะแสดงผล บรรทัดที่สองคือการนำข้อมูลจากตาราง SalesData มาเตรียมไว้ บรรทัดที่ 3-6 คือการทำ PIVOT โดยใช้ SUM รวมยอดขาย และใช้ FOR ระบุว่าสินค้าไหนบ้างที่ต้องการให้กลายเป็นหัวตาราง
ผลลัพธ์ที่ควรเห็นคือตารางที่อ่านง่ายขึ้น:
Year | Apple | Orange
2023 | 100 | 150
2024 | 200 | 120
เมื่อไหร่ที่ต้องใช้ UNPIVOT
UNPIVOT คือการทำงานย้อนกลับจาก PIVOT มักใช้ในงานที่ต้องนำข้อมูลจากรายงานสรุป (ที่คนอ่านง่าย) เข้าสู่ระบบฐานข้อมูลหลักเพื่อทำการคำนวณที่ซับซ้อนขึ้น หรือเพื่อเตรียมข้อมูลให้พร้อมสำหรับ Data Analysis (การวิเคราะห์ข้อมูลด้วยโปรแกรม)
ถ้าคุณได้รับไฟล์ Excel จากบัญชีที่สรุปมาเป็นหัวตารางรายเดือน แต่คุณต้องเอาข้อมูลนี้ไปเก็บในระบบเพื่อทำกราฟแสดงแนวโน้มตลอด 5 ปี การเก็บข้อมูลแบบตารางสรุปจะทำให้คุณเขียนโค้ดคำนวณได้ยากมาก คุณต้องแปลงมันเป็นรายการแนวตั้งก่อน
การทำ UNPIVOT จะเปลี่ยนหัวคอลัมน์หลายๆ อัน ให้กลายเป็นค่าในคอลัมน์เดียว และเอาตัวเลขที่เคยอยู่ใต้หัวคอลัมน์นั้นไปรวมอยู่ในคอลัมน์ Amount อีกอันหนึ่ง ทำให้ข้อมูลกลับไปอยู่ในรูปแบบที่คอมพิวเตอร์จัดการได้สะดวกเหมือนเดิม
วิธีใช้ UNPIVOT กลับสู่รูปแบบรายการ
การเขียน UNPIVOT จะคล้ายกับ PIVOT แต่เราต้องระบุชื่อคอลัมน์ใหม่ที่จะใช้เก็บชื่อหัวข้อเดิม และชื่อคอลัมน์ใหม่ที่จะใช้เก็บตัวเลขค่าเหล่านั้น เราต้องระบุให้ชัดเจนว่าคอลัมน์ไหนบ้างที่ต้องการจะยุบรวมเข้ามา
มือใหม่มักงงว่าทำไมต้องตั้งชื่อคอลัมน์ใหม่เอง คำตอบคือเพราะเรากำลังสร้างโครงสร้างตารางใหม่ขึ้นมา ฐานข้อมูลไม่มีทางรู้ว่าเราอยากตั้งชื่อว่าอะไร เราจึงต้องเป็นคนกำหนดชื่อคอลัมน์ Product และ Amount ขึ้นมาเองในขั้นตอนนี้
จุดที่ต้องระวังคือค่าที่เป็น NULL ในตารางต้นทาง ถ้าเราไม่จัดการให้ดี ข้อมูลที่ไม่มีค่าจะหายไปจากการ SELECT ของเราทันที ถ้าต้องการเก็บไว้ต้องตรวจสอบการตั้งค่าของ Database Engine (โปรแกรมที่ทำหน้าที่จัดการฐานข้อมูล) ที่เราใช้อยู่
SELECT Year, Product, Amount
FROM SalesReport
UNPIVOT (
Amount FOR Product IN ([Apple], [Orange])
) AS UnpivotTable;
บรรทัดที่ 3 คือการบอกว่าเอาค่าตัวเลขไปเก็บไว้ที่ Amount และเอาชื่อหัวคอลัมน์ไปเก็บที่ Product บรรทัดที่ 4 คือการระบุว่าเราจะเลือกคอลัมน์ไหนบ้างในตาราง SalesReport มายุบรวมเป็นแนวตั้ง
ผลลัพธ์ที่ได้คือข้อมูลที่กลับไปอยู่ในรูปแบบเรียงลงมา:
Year | Product | Amount
2023 | Apple | 100
2023 | Orange | 150
สรุปการนำไปใช้งานจริงของโปรแกรมเมอร์
การใช้ PIVOT และ UNPIVOT ไม่ใช่แค่เรื่องของการจัดรูปแบบข้อมูล แต่เป็นทักษะสำคัญในการสื่อสารระหว่าง "คน" กับ "เครื่อง" โปรแกรมเมอร์ที่ดีต้องรู้วิธีแปลงข้อมูลให้เหมาะสมกับงานที่ทำ ไม่ว่าจะเป็นการทำรายงานให้ทีมบริหาร หรือการเตรียมข้อมูลเข้าโมเดลทำนายยอดขาย
ตัวอย่างการใช้งานจริงที่เจอบ่อยคือ การดึงข้อมูลจากฐานข้อมูลมาทำ Dashboard (หน้าจอสรุปผลข้อมูล) ถ้าคุณใช้เครื่องมืออย่าง Power BI หรือ Tableau คุณอาจจะใช้ฟังก์ชันเหล่านี้ช่วยเตรียมข้อมูลก่อนจะลากวางกราฟ ซึ่งจะช่วยให้คุณทำงานได้เร็วขึ้นกว่าการมานั่งแก้ข้อมูลด้วยมือใน Excel
จำไว้ว่า เครื่องมือเหล่านี้มีไว้เพื่อช่วยให้งานง่ายขึ้น อย่ากลัวที่จะลองเขียนโค้ดเพื่อทดสอบกับข้อมูลชุดเล็กๆ ก่อนเสมอ เมื่อคุณเข้าใจว่าข้อมูลมันวิ่งจากแนวตั้งไปแนวนอนอย่างไร คุณจะสามารถจัดการกับโครงสร้างข้อมูลที่ซับซ้อนในโปรเจกต์ใหญ่ๆ ได้อย่างมั่นใจแน่นอน