عملگر گروهی GROUP_CONCAT
در PostgreSQL
عملگر GROUP_CONCAT
در PostgreSQL برای ترکیب چندین مقدار از یک ستون به یک رشته واحد، زمانی که از آن ستون گروهبندی میکنیم، استفاده میشود. این عملگر به خصوص در مواردی مفید است که میخواهیم اطلاعات مرتبط با هر گروه را در یک رشته واحد جمعآوری کنیم.
نحو استفاده
GROUP_CONCAT(expression [ORDER BY expression [ASC | DESC]] [SEPARATOR ','])
- expression: عبارت یا ستونی که مقادیر آن باید ترکیب شوند.
- ORDER BY: برای مرتبسازی مقادیر قبل از ترکیب آنها استفاده میشود.
- ASC | DESC: برای تعیین جهت مرتبسازی (صعودی یا نزولی) استفاده میشود.
- SEPARATOR: کاراکتر یا رشتهای که برای جدا کردن مقادیر استفاده میشود. اگر مشخص نشود، کاما (,) به عنوان جداکننده پیشفرض استفاده میشود.
مثال
فرض کنید جدولی به نام orders
داریم که شامل ستونهایی مانند order_id
و product_name
است. میخواهیم برای هر مشتری، لیستی از محصولاتی که خریداری کرده است را در یک رشته جدا شده با کاما نمایش دهیم.
SELECT customer_id, GROUP_CONCAT(product_name) AS products
FROM orders
GROUP BY customer_id;
در این مثال:
GROUP_CONCAT(product_name)
تمام مقادیر ستونproduct_name
را برای هرcustomer_id
منحصر به فرد ترکیب میکند.AS products
یک نام مستعار برای ستون جدیدی که ایجاد میشود، قرار میدهد.
مثال با مرتبسازی و جداکننده سفارشی
SELECT customer_id, GROUP_CONCAT(product_name ORDER BY product_name DESC SEPARATOR '; ') AS products
FROM orders
GROUP BY customer_id;
در این مثال:
- مقادیر
product_name
قبل از ترکیب به صورت نزولی مرتب میشوند. - از کاراکتر
;
به عنوان جداکننده استفاده میشود.
مثال عددی برای عملگر GROUP_CONCAT در PostgreSQL
فرض کنید جدولی به نام orders
با ساختار زیر داریم:
order_id | customer_id | product_name |
---|---|---|
۱۰۰۱ | ۱ | سیب |
۱۰۰۲ | ۱ | موز |
۱۰۰۳ | ۱ | پرتقال |
۱۰۰۴ | ۲ | انگور |
۱۰۰۵ | ۲ | سیب |
۱۰۰۶ | ۳ | موز |
میخواهیم برای هر مشتری، لیستی از محصولات خریداری شده را در یک رشته جدا شده با کاما نمایش دهیم.
Query:
SELECT customer_id, GROUP_CONCAT(product_name) AS products
FROM orders
GROUP BY customer_id;
نتیجه:
customer_id | products |
---|---|
۱ | سیب, موز, پرتقال |
۲ | انگور, سیب |
۳ | موز |
تفسیر:
- برای هر
customer_id
منحصر به فرد، تمام مقادیرproduct_name
مربوط به آن مشتری جمعآوری شده و در یک رشته با جداکننده کاما قرار گرفته است.
مثال دیگر با مرتبسازی و جداکننده سفارشی:
فرض کنید میخواهیم محصولات هر مشتری را به ترتیب حروف الفبا و با جداکننده خط تیره نمایش دهیم:
SELECT customer_id, GROUP_CONCAT(product_name ORDER BY product_name ASC SEPARATOR ' - ') AS products
FROM orders
GROUP BY customer_id;
نتیجه:
customer_id | products |
---|---|
۱ | سیب – موز – پرتقال |
۲ | انگور – سیب |
۳ | موز |
در این مثال:
- محصولات هر مشتری به ترتیب حروف الفبا مرتب شدهاند.
- از خط تیره (
-
) به عنوان جداکننده استفاده شده است.
مثال با محدود کردن تعداد محصولات نمایش داده شده:
فرض کنید میخواهیم حداکثر دو محصول اول هر مشتری را نمایش دهیم:
این کار به صورت مستقیم با GROUP_CONCAT
امکانپذیر نیست، اما میتوانیم از یک زیر پرسجو برای محدود کردن نتایج و سپس GROUP_CONCAT
را روی نتایج زیر پرسجو اعمال کنیم.
SELECT customer_id, GROUP_CONCAT(product_name) AS products
FROM (
SELECT customer_id, product_name
FROM orders
ORDER BY product_name
LIMIT 2
) AS limited_products
GROUP BY customer_id;
این مثالها نشان میدهند که GROUP_CONCAT
ابزاری بسیار قدرتمند برای ترکیب دادهها در PostgreSQL است و با استفاده از آن میتوان گزارشهای پیچیدهتری ایجاد کرد.
نکات مهم
- تابع جمعشونده:
GROUP_CONCAT
یک تابع جمعشونده است و معمولاً با عبارتGROUP BY
استفاده میشود. - طول رشته: حداکثر طول رشتهای که توسط
GROUP_CONCAT
ایجاد میشود، توسط پارامترgroup_concat_max_len
در فایلpostgresql.conf
قابل تنظیم است. - NULL values: مقادیر NULL به طور پیشفرض نادیده گرفته میشوند.
- تابع
STRING_AGG
: در نسخههای جدیدتر PostgreSQL، تابعSTRING_AGG
نیز برای انجام همین کار استفاده میشود و برخی ویژگیهای اضافی را ارائه میدهد.
کاربردهای رایج
- گزارشگیری: برای ایجاد گزارشهایی که اطلاعات مربوط به چندین سطر را در یک سطر نمایش میدهند.
- ساخت منوها و لیستهای کشویی: برای ایجاد لیستهای کشویی دینامیک در برنامههای وب.
- تجزیه و تحلیل داده: برای تجزیه و تحلیل دادهها و ایجاد خلاصههای مفید.
مثال عملی دیگر:
فرض کنید جدولی به نام employees
داریم که شامل ستونهایی مانند department_id
و employee_name
است. میخواهیم برای هر بخش، لیستی از کارمندان را به صورت حروف الفبا نمایش دهیم.
SELECT department_id, GROUP_CONCAT(employee_name ORDER BY employee_name ASC) AS employees
FROM employees
GROUP BY department_id;
جمعبندی:
GROUP_CONCAT
یک ابزار قدرتمند در PostgreSQL است که به شما امکان میدهد دادهها را به روشهای مختلف خلاصه و نمایش دهید. با درک نحوه کار این تابع، میتوانید گزارشها و تحلیلهای پیچیدهتری را ایجاد کنید.