Oto jeden ze sposobów, aby to zrobić.
Ponieważ chcesz również uzyskać różne liczby, możesz to zrobić po prostu dwukrotnie grupując wiersze. Pierwsza GROUP BY
usunie duplikaty, drugi GROUP BY
przyniesie ostateczny wynik.
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
;
Wynik
+---------+-----------+--------------+----------+
| State | City | # Of Sitings | Animals |
+---------+-----------+--------------+----------+
| Arizona | Flagstaff | 1 | dog |
| Arizona | Phoenix | 2 | bird,dog |
| Florida | Orlando | 2 | bird,dog |
+---------+-----------+--------------+----------+
Jeśli nadal otrzymujesz komunikat o błędzie o przekroczeniu 8000 znaków, rzuć wartości na varchar(max)
przed STRING_AGG
.
Coś jak
STRING_AGG(CAST(Siting AS varchar(max)),',') AS Animals