Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Produci valori DISTINCT in STRING_AGG

Ecco un modo per farlo.

Dal momento che vuoi anche i conteggi distinti, puoi farlo semplicemente raggruppando le righe due volte. Il primo GROUP BY rimuoverà i duplicati, il secondo GROUP BY produrrà il risultato finale.

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
;

Risultato

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

Se ricevi ancora un messaggio di errore relativo al superamento di 8000 caratteri, esegui il cast dei valori su varchar(max) prima di STRING_AGG .

Qualcosa come

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