Ne işe yarar?
“Her departmanın çalışanlarını tek satırda listele” gibi raporlarda, gruptaki değerleri bir metinde birleştiren toplama fonksiyonu kullanılır. COUNT veya SUM gibi çalışır; yalnızca sonuç sayı değil metindir.
| SQL türü | Fonksiyon | Sıralı yazım |
|---|---|---|
| SQL Server 2017+ | STRING_AGG(ad, ', ') | STRING_AGG(ad, ', ') WITHIN GROUP (ORDER BY ad) |
| PostgreSQL, BigQuery | STRING_AGG(ad, ', ') | STRING_AGG(ad, ', ' ORDER BY ad) |
| MySQL | GROUP_CONCAT(ad SEPARATOR ', ') | GROUP_CONCAT(ad ORDER BY ad SEPARATOR ', ') |
| Oracle | LISTAGG(ad, ', ') | LISTAGG(ad, ', ') WITHIN GROUP (ORDER BY ad) |
| SQLite | GROUP_CONCAT(ad, ', ') | GROUP_CONCAT(ad, ', ' ORDER BY ad) (3.44+) |
Temel kullanım
SELECT d.name AS departman, GROUP_CONCAT(e.first_name, ', ' ORDER BY e.hire_date) AS calisanlar FROM departments d JOIN employees e ON e.dept_id = d.dept_id GROUP BY d.name;
Sırayı belirtORDER BY yazmazsan birleştirme sırası garanti değildir; aynı sorgu farklı günlerde farklı sırayla dönebilir. Raporda sıra önemliyse her zaman sıralı yazımı kullan.
NULL ve tekrarlar
- NULL değerler atlanır; ayraç da eklenmez.
- Tekrarsız liste için PostgreSQL ve MySQL'de
DISTINCTyazılır:STRING_AGG(DISTINCT city, ', '). SQL Server'da STRING_AGG içinde DISTINCT yoktur; önce alt sorguda tekrarları temizle.
Uzunluk sınırları
| SQL türü | Sınır | Çözüm |
|---|---|---|
| MySQL | group_concat_max_len varsayılan 1024 bayt; aşan kısım sessizce kesilir | SET SESSION group_concat_max_len = 100000; |
| Oracle | VARCHAR2 sınırı (4000 bayt) aşılırsa hata | LISTAGG(ad, ', ' ON OVERFLOW TRUNCATE) (12.2+) |
| SQL Server | Girdi NVARCHAR(4000) ise sonuç 8000 bayta sığmalı | STRING_AGG(CAST(ad AS NVARCHAR(MAX)), ', ') |
Eski SQL Server sürümleri2017 öncesinde aynı iş
STUFF(... FOR XML PATH('')) ile yapılırdı. Bu yöntem T-SQL modülündeki “Listeleri bölmek ve birleştirmek” dersinde anlatılıyor.