Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Produzir valores DISTINCT em STRING_AGG


Aqui está uma maneira de fazer isso.

Como você também deseja as contagens distintas, isso pode ser feito simplesmente agrupando as linhas duas vezes. O primeiro GROUP BY irá remover duplicatas, o segundo GROUP BY produzirá o resultado 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
;

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

Se você ainda estiver recebendo uma mensagem de erro sobre exceder 8.000 caracteres, converta os valores para varchar(max) antes de STRING_AGG .

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