Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Produire des valeurs DISTINCT dans STRING_AGG

Voici une façon de procéder.

Puisque vous voulez également des nombres distincts, cela peut être fait simplement en regroupant les lignes deux fois. Le premier GROUP BY supprimera les doublons, le second GROUP BY produira le résultat final.

WITH
Sitings
AS
(
    SELECT * FROM (VALUES 
    (1, 'Florida', 'Orlando', 'bird'),
    (2, 'Florida', 'Orlando', 'dog'),
    (3, 'Arizona', 'Phoenix', 'bird'),
    (4, 'Arizona', 'Phoenix', 'dog'),
    (5, 'Arizona', 'Phoenix', 'bird'),
    (6, 'Arizona', 'Phoenix', 'bird'),
    (7, 'Arizona', 'Phoenix', 'bird'),
    (8, 'Arizona', 'Flagstaff', 'dog')
    ) F (ID, State, City, Siting)
)
,CTE_Animals
AS
(
    SELECT
        State, City, Siting
    FROM Sitings
    GROUP BY State, City, Siting
)
SELECT
    State, City, COUNT(1) AS [# Of Sitings], STRING_AGG(Siting,',') AS Animals
FROM CTE_Animals
GROUP BY State, City
ORDER BY
    State
    ,City
;

Résultat

+---------+-----------+--------------+----------+
|  State  |   City    | # Of Sitings | Animals  |
+---------+-----------+--------------+----------+
| Arizona | Flagstaff |            1 | dog      |
| Arizona | Phoenix   |            2 | bird,dog |
| Florida | Orlando   |            2 | bird,dog |
+---------+-----------+--------------+----------+

Si vous recevez toujours un message d'erreur concernant le dépassement de 8 000 caractères, convertissez les valeurs en varchar(max) avant STRING_AGG .

Quelque chose comme

STRING_AGG(CAST(Siting AS varchar(max)),',') AS Animals