Ana içeriğe geç
Kesit SQL
Temel · Özetleme

Satırları tek metinde toplamak: STRING_AGG, LISTAGG, GROUP_CONCAT

Bir gruptaki değerleri virgülle ayrılmış tek bir metinde birleştirmek; sıralama, tekrarsızlık ve uzunluk sınırları.

Uygulamada aç, 6 alıştırmayı çözÜcretsiz, hesap gerekmez, kurulum yok.

Bu sayfa dersin okuma sürümüdür. Metin bir kutuyu çalıştırmanı ya da adıma geçmeni söylüyorsa dersi uygulamada aç.

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üFonksiyonSıralı yazım
SQL Server 2017+STRING_AGG(ad, ', ')STRING_AGG(ad, ', ') WITHIN GROUP (ORDER BY ad)
PostgreSQL, BigQuerySTRING_AGG(ad, ', ')STRING_AGG(ad, ', ' ORDER BY ad)
MySQLGROUP_CONCAT(ad SEPARATOR ', ')GROUP_CONCAT(ad ORDER BY ad SEPARATOR ', ')
OracleLISTAGG(ad, ', ')LISTAGG(ad, ', ') WITHIN GROUP (ORDER BY ad)
SQLiteGROUP_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

Uzunluk sınırları

SQL türüSınırÇözüm
MySQLgroup_concat_max_len varsayılan 1024 bayt; aşan kısım sessizce kesilirSET SESSION group_concat_max_len = 100000;
OracleVARCHAR2 sınırı (4000 bayt) aşılırsa hataLISTAGG(ad, ', ' ON OVERFLOW TRUNCATE) (12.2+)
SQL ServerGirdi 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.
Alıştırmalara geç (6)