• 30.9.2018
  • Ing. Jan Zedníček - Data Engineer & Controlling
  • 1

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:

STRING_AGG - příklad

Převedení řádku tabulky na string:

SELECT STRING_AGG(String, ‘ ‘) AS Hodnota
FROM Temp.dbo.Biportal_Test

STRING_AGG - řešení příkladu - agregace řádku do hodnoty

5/5 - (1 vote)

Ing. Jan Zedníček - Data Engineer & Controlling

Jmenuji se Honza Zedníček a působím jako freelancer. Pracoval jsem dříve také jako BI developer, finanční controller a analytik. Vše pro společnosti z oblasti IT, bankovnictví, consultingu a výroby. Po práci si rád zahraju tenis, volejbal, šachy, zajdu do posilovny a občas neúspěšně odpálím pár balónků v golfu 🏌️

Již cca 10 let zapisuji na tento web různé návody určené zejména odborné veřejnosti, studentům a zájemcům o informace z oblastí Business intelligence, korporátních financí a reportingu.

🔥 Přihlašte se do naší Excel facebook skupiny (2.4k+ členů), kde si pomáháme Excel CZ/SK diskuse »

1 comment on “SQL STRING_AGG – spojení řádků do jedné hodnoty (concat string)

  1. 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

Leave a Reply

Your email address will not be published. Required fields are marked *