Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Produzieren Sie DISTINCT-Werte in STRING_AGG

Hier ist eine Möglichkeit, dies zu tun.

Da Sie auch die unterschiedlichen Zählungen wünschen, können Sie die Zeilen einfach zweimal gruppieren. Das erste GROUP BY entfernt Duplikate, das zweite GROUP BY wird das Endergebnis liefern.

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
;

Ergebnis

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

Wenn Sie immer noch eine Fehlermeldung über das Überschreiten von 8000 Zeichen erhalten, wandeln Sie die Werte in varchar(max) um vor STRING_AGG .

So etwas wie

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