group_concat / string_agg în SQLite

Lipește într-un singur text valorile dintr-un grup de rânduri, cu separatorul ales, de exemplu toți elevii unui curs.

Sintaxă
group_concat(x [, separator])
group_concat(DISTINCT x)
string_agg(x, separator)                    -- 3.44.0
group_concat(x, separator ORDER BY y)       -- 3.44.0

Ce face group_concat / string_agg

group_concat(x) este o funcție de agregare: pentru fiecare grup din GROUP BY (sau pentru tot tabelul) întoarce un text cu toate valorile lui x lipite între ele. Separatorul implicit este virgula (,); al doilea argument alege alt separator. Valorile NULL sunt sărite.

string_agg(x, separator) există din SQLite 3.44.0 și face același lucru, cu numele din PostgreSQL și SQL Server; la ea separatorul este obligatoriu. Tot din 3.44.0 poți scrie ORDER BY în interiorul apelului ca să alegi ordinea valorilor. Fără el, ordinea este cea în care SQLite citește rândurile și nu este garantată.

group_concat(DISTINCT x) elimină dublurile, dar în SQLite o agregare cu DISTINCT poate avea un singur argument, deci nu poți alege separatorul în același timp. Echivalentul din MySQL este GROUP_CONCAT cu sintaxa SEPARATOR, care în SQLite nu există.

Parametri

Parametru Descriere
x Valoarea lipită din fiecare rând; NULL este ignorat.
separator Textul pus între valori; implicit ',' la group_concat.
ORDER BY y Opțional (3.44.0+): ordinea în care sunt lipite valorile.

Ce returnează

Un text, sau NULL dacă grupul nu are nicio valoare nenulă.

Exemple

Exemplele de pe această pagină pornesc de la datele de mai jos. Rulează mai întâi acest cod, apoi exemplul.

CREATE TABLE inscrieri (
  elev TEXT NOT NULL,
  curs TEXT NOT NULL,
  oras TEXT NOT NULL
);
INSERT INTO inscrieri VALUES
  ('Mihai', 'Python', 'Iași'),
  ('Ana',   'Python', 'Iași'),
  ('Elena', 'SQL',    'Cluj'),
  ('Ana',   'SQL',    'Iași'),
  ('Dan',   'Python', 'Cluj');

Exemplul 1: Elevii fiecărui curs

Separatorul implicit este virgula fără spațiu. ORDER BY elev în interiorul apelului face lista alfabetică.

SELECT curs,
       group_concat(elev ORDER BY elev) AS elevi,
       COUNT(*) AS numar
FROM inscrieri
GROUP BY curs
ORDER BY curs;

Rezultat

╭────────┬───────────────┬───────╮
│  curs  │     elevi     │ numar │
╞════════╪═══════════════╪═══════╡
│ Python │ Ana,Dan,Mihai │     3 │
│ SQL    │ Ana,Elena     │     2 │
╰────────┴───────────────┴───────╯

Exemplul 2: string_agg cu separator ales

Pentru fiecare elev, cursurile sunt lipite cu ' + '. Rezultatul este identic cu group_concat(curs, ' + ' ORDER BY curs).

SELECT elev, string_agg(curs, ' + ' ORDER BY curs) AS cursuri
FROM inscrieri
GROUP BY elev
ORDER BY elev;

Rezultat

╭───────┬──────────────╮
│ elev  │   cursuri    │
╞═══════╪══════════════╡
│ Ana   │ Python + SQL │
│ Dan   │ Python       │
│ Elena │ SQL          │
│ Mihai │ Python       │
╰───────┴──────────────╯

Exemplul 3: Valori unice cu DISTINCT

Fără DISTINCT, Iași ar apărea de două ori la Python. Cu DISTINCT nu poți da separator, așa că rămâne virgula.

SELECT curs, group_concat(DISTINCT oras) AS orase
FROM inscrieri
GROUP BY curs
ORDER BY curs;

Rezultat

╭────────┬───────────╮
│  curs  │   orase   │
╞════════╪═══════════╡
│ Python │ Iași,Cluj │
│ SQL    │ Cluj,Iași │
╰────────┴───────────╯

Greșeli frecvente

  • Copiezi sintaxa MySQL GROUP_CONCAT(x SEPARATOR '; '). În SQLite separatorul este al doilea argument: group_concat(x, '; ').
  • Scrii group_concat(DISTINCT x, '; '). SQLite răspunde „DISTINCT aggregates must have exactly one argument”; elimină dublurile într-o subinterogare cu SELECT DISTINCT și apoi aplică group_concat(x, '; ').
  • Te bazezi pe ordinea valorilor fără ORDER BY în apel. Ordinea poate să se schimbe după un index nou sau după VACUUM.

Comenzi înrudite

  • json_group_array / json_group_object: Funcții de agregare care adună valorile dintr-un grup de rânduri într-un tablou sau obiect JSON, gata de trimis unui API.
  • ROW_NUMBER, RANK, LAG (funcții fereastră): Calculează pentru fiecare rând un număr de ordine, un loc în clasament sau valoarea din rândul vecin, fără să grupeze rândurile.
  • WITH (CTE): Dă un nume unei subinterogări (Common Table Expression) și o folosește apoi ca pe un tabel, ca interogarea să fie mai ușor de citit.
Comunitate & Schimb de cunoștințe

Întrebări & Exemple de Cod: group_concat / string_agg

Ai o nelămurire despre utilizarea comenzii group_concat / string_agg sau ai descoperit un truc / fragment de cod util? Distribuie-l cu ceilalți programatori!

💬

Fii primul care pune o întrebare sau distribuie un fragment de cod / prompt!

Nu au fost adăugate încă întrebări sau exemple de cod pentru această pagină. Dacă ai întâlnit o problemă sau ai un snippet util, adaugă-l mai jos pentru a-i ajuta pe ceilalți.

Comunitate Adaugă o întrebare sau distribuie un cod

Moderare & Siguranță:

Pentru a menține calitatea și securitatea informațiilor, fiecare întrebare sau fragment de cod/prompt este analizat (manual sau prin moderare asistată de AI) înainte de publicare.