Nedávno jsem řešil úlohu, když jsem potřeboval v tabulce spojit řádky v nějaké tabulce do 1 string hodnoty. To nebylo u SQL Server ještě nedávno úplně jednoduché, protože narozdíl od třeba mysql neobsahoval speciální funkci k tomu určenou (muselo se na to jít přes příkaz FOR XML PATH). V SQL Server 2017 byla ale nasazena sql textová funkce STRING_AGG a s ní je to daleko jednodušší.
Syntaxe funkce STRING_AGG
SELECT
STRING_AGG (expression, separator) WITHIN GROUP (ORDER BY <order_by_expression_list> [ ASC | DESC ])
FROM <Tabulka>
Funkce má 2 povinné argumenty:
- expression – sloupec s hodnotami, které se mají spojovat
- separator – čím mají být hodnoty odděleny
Nepovinná klauzule WITHIN GROUP – pomocí klauzule můžeme hodnoty před spojením uspořádat vzestupně nebo sestupně
Příklad spojení (concatenate) řádků v tabulce do hodnoty (string)
CREATE TABLE Temp.dbo.Biportal_Test (
String VARCHAR(20)
)
INSERT INTO Temp.dbo.Biportal_Test (String)
VALUES
(‘Text,’),
(‘který’),
(‘chci’),
(‘agregovat’),
(‘na’),
(‘hodnotu’)
SELECT * FROM Temp.dbo.Biportal_Test;
Tabulka:
Převedení řádku tabulky na string:
SELECT STRING_AGG(String, ‘ ‘) AS Hodnota
FROM Temp.dbo.Biportal_Test
Pro tabulku (kupř. TB_POZNAMKY):
ID | CIS_SML | POR | POZN
1 | 0560334 | 1 | Klient předložil ohodnocení |
2 | 0560334 | 2 | stavebního pozemku dne |
3 | 0560334 | 3 | 24.4. 2023 |
4 | 8847201 | 1 | Nedostavil se na schůzku |
5 | 8847201 | 2 | dne 31.12.2023 ve 21:00 |
lze použít GROUP BY:
SELECT CIS_SML AS “Číslo smlouvy”,
STRING_AGG(TRIM(POZN), ‘ ‘) AS “Poznámka”
FROM TB_POZNAMKY
GROUP BY CIS_SML
dostaneme:
Číslo smlouvy | Poznámka
0560334 | Klient předložil ohodnocení stavebního pozemku dne 24.4. 2023
8847201 | Nedostavil se na schůzku dne 31.12.2023 ve 21:00