MS-SQL

วิธีใช้ PIVOT และ UNPIVOT ใน SQL เพื่อจัดการข้อมูลรายงานให้เป็นมืออาชีพ

8 นาที 13 views บันทึกเป็น PDF
วิธีใช้ PIVOT และ UNPIVOT ใน SQL เพื่อจัดการข้อมูลรายงานให้เป็นมืออาชีพ

เบื่อไหมที่ต้องจัดการข้อมูลในฐานข้อมูลที่อ่านยาก? มาเรียนรู้วิธีใช้ PIVOT และ UNPIVOT เพื่อแปลงข้อมูลจากแนวตั้งเป็นแนวนอนและกลับกัน ช่วยให้ทำรายงานได้ง่ายขึ้น

ทำไมต้องรู้จัก 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

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

แชร์บทความ

Facebook X LINE

บทความที่เกี่ยวข้อง

คู่มือ MS-SQL Backup, Restore และการตั้งค่า Maintenance Plans สำหรับมือใหม่
MS-SQL

คู่มือ MS-SQL Backup, Restore และการตั้งค่า Maintenance Plans สำหรับมือใหม่

เรียนรู้วิธีสำรองข้อมูล (Backup) และกู้คืน (Restore) ฐานข้อมูล MS-SQL ด้วย SSMS พร้อมวิธีตั้งค่าระบบอัตโนมัติ เพื่อป้องกันข้อมูลหายสำหรับโปรแกรมเมอร์มือใหม่

3 weeks ago 7 นาที
14 views
คู่มือการจัดการความปลอดภัยใน MS-SQL: Logins, Users และการคุมสิทธิ์ด้วย GRANT, DENY, REVOKE
MS-SQL

คู่มือการจัดการความปลอดภัยใน MS-SQL: Logins, Users และการคุมสิทธิ์ด้วย GRANT, DENY, REVOKE

ไม่อยากให้ฐานข้อมูลถูกแฮกต้องอ่าน! เรียนรู้วิธีตั้งค่าความปลอดภัยใน MS-SQL ตั้งแต่การสร้าง Login (บัญชีผู้ใช้) ไปจนถึงการคุมสิทธิ์เข้าถึงข้อมูลให้ปลอดภัย

3 weeks ago 9 นาที
15 views
เจาะลึก MS-SQL Trigger (AFTER & INSTEAD OF) พร้อมวิธีจัดการ Error ด้วย TRY...CATCH
MS-SQL

เจาะลึก MS-SQL Trigger (AFTER & INSTEAD OF) พร้อมวิธีจัดการ Error ด้วย TRY...CATCH

เรียนรู้การใช้ Trigger ใน MS-SQL เพื่อจัดการข้อมูลอัตโนมัติ พร้อมเทคนิคการเขียน Error Handling ให้ระบบเสถียร ไม่พังง่าย เหมาะสำหรับมือใหม่หัดเขียนฐานข้อมูล

3 weeks ago 9 นาที
15 views