PlusMagi's Blog By Pitt Phunsanit Database mySql: แสดงข้อมูลหลายแถวไว้ในชุดเดียวคอลัมน์เดียว

mySql: แสดงข้อมูลหลายแถวไว้ในชุดเดียวคอลัมน์เดียว

ในโลกของการจัดการฐานข้อมูล ข้อมูลส่วนใหญ่มักถูกจัดเก็บในรูปแบบแถว (Rows) และคอลัมน์ (Columns) อย่างเป็นระเบียบ แต่ในหลายกรณีทางธุรกิจ เราอาจต้องการสรุปข้อมูลที่กระจัดกระจายอยู่ในหลายแถว ให้กลายเป็นชุดข้อมูลเดียวในคอลัมน์เดียว ไม่ว่าจะเป็นรายการข้อความที่คั่นด้วยเครื่องหมายจุลภาค หรือชุดข้อมูลที่เป็น Array เพื่อความสะดวกในการแสดงผลหรือการประมวลผล

สำหรับ PostgreSQL ซึ่งเป็นระบบจัดการฐานข้อมูลที่ทรงพลัง มีฟังก์ชันการรวมกลุ่ม (Aggregation Functions) ที่ถูกออกแบบมาเพื่อจัดการสถานการณ์นี้โดยเฉพาะ คือ STRING_AGG() และ ARRAY_AGG() บทความนี้จะเจาะลึกวิธีการใช้ฟังก์ชันเหล่านี้เพื่อเปลี่ยนหลายแถวให้เป็นคอลัมน์เดียวได้อย่างมีประสิทธิภาพ

💡 หลักการทำงาน: การรวมกลุ่มข้อมูล (Aggregation)

เมื่อเราต้องการรวมข้อมูลหลายรายการที่เกี่ยวข้องกับกลุ่มเดียวกัน (เช่น รายชื่อสินค้าทั้งหมดที่อยู่ในหมวดหมู่ ‘เครื่องดื่ม’) เราจำเป็นต้องใช้คำสั่ง GROUP BY ร่วมกับฟังก์ชันรวมกลุ่ม (Aggregate Functions) ซึ่งจะทำการรวบรวมค่าจากหลายแถวให้เหลือเพียงค่าเดียวต่อกลุ่ม

1. การรวมเป็นข้อความ (String Aggregation) ด้วย STRING_AGG()

ฟังก์ชัน STRING_AGG() เหมาะสำหรับการรวมค่าจากหลายแถวให้เป็นข้อความ (String) เดียว โดยเราสามารถกำหนดตัวคั่น (Delimiter) ได้ตามต้องการ เช่น ลูกน้ำ (,) หรือเครื่องหมายขีดกลาง (-)

ตัวอย่างการใช้งาน:

SQL

SELECT
    department_id,
    STRING_AGG(product_name, ', ')
FROM
    products
GROUP BY
    department_id;

ผลลัพธ์ที่ได้: หากมีสินค้า ‘A’, ‘B’, และ ‘C’ ในแผนกเดียวกัน ผลลัพธ์จะแสดงเป็นข้อความเดียวคือ: ‘A, B, C’

2. การรวมเป็นอาร์เรย์ (Array Aggregation) ด้วย ARRAY_AGG()

ฟังก์ชัน ARRAY_AGG() เป็นทางเลือกที่ทรงพลังกว่าเมื่อคุณต้องการให้ข้อมูลที่รวมกันยังคงมีโครงสร้างเป็นข้อมูลประเภท Array ของ PostgreSQL ซึ่งมีประโยชน์อย่างยิ่งในการนำข้อมูลไปใช้ในการคำนวณหรือเปรียบเทียบในขั้นตอนถัดไป

ตัวอย่างการใช้งาน:

SQL

SELECT
    department_id,
    ARRAY_AGG(product_name)
FROM
    products
GROUP BY
    department_id;

ผลลัพธ์ที่ได้: หากมีสินค้า ‘A’, ‘B’, และ ‘C’ ผลลัพธ์จะแสดงเป็น Array: {A, B, C}

✨ สรุปความแตกต่างและการเลือกใช้

การเลือกระหว่าง STRING_AGG() และ ARRAY_AGG() ขึ้นอยู่กับวัตถุประสงค์ของข้อมูลปลายทาง:

  • ใช้ STRING_AGG(): เมื่อคุณต้องการแสดงผลข้อมูลในรูปแบบข้อความที่อ่านง่าย (เช่น รายการสินค้าบนหน้าเว็บ) และไม่จำเป็นต้องนำข้อมูลนั้นไปคำนวณต่อในฐานข้อมูล
  • ใช้ ARRAY_AGG(): เมื่อคุณต้องการให้ข้อมูลที่รวมกันยังคงเป็นโครงสร้างข้อมูลที่สามารถนำไปใช้ในการประมวลผลทางตรรกะ (Logic) หรือการคำนวณทางฐานข้อมูลต่อได้

✅ บทสรุป

การทำความเข้าใจฟังก์ชัน STRING_AGG() และ ARRAY_AGG() ใน PostgreSQL เป็นทักษะสำคัญสำหรับนักพัฒนาและสถาปนิกฐานข้อมูลที่ต้องการดึงข้อมูลสรุปในรูปแบบที่ยืดหยุ่นและมีประสิทธิภาพ การใช้ฟังก์ชันเหล่านี้จะช่วยให้คุณสามารถแปลงข้อมูลแบบหลายแถวให้เป็นคอลัมน์เดียวได้อย่างแม่นยำ ทำให้การรายงานและการแสดงผลข้อมูลมีความสมบูรณ์ยิ่งขึ้น