Jak mogę uzyskać:
id Name Value
1 A 4
1 B 8
2 C 9
do
id Column
1 A:4, B:8
2 C:9
Jak mogę uzyskać:
id Name Value
1 A 4
1 B 8
2 C 9
do
id Column
1 A:4, B:8
2 C:9
GROUP_CONCAT()
funkcji agregującej, ale rozwiązanie go na Microsoft SQL Server jest trudniejsze. Aby uzyskać pomoc, zobacz następujące pytanie SO: „ Jak uzyskać wiele rekordów w stosunku do jednego rekordu na podstawie relacji? ”Odpowiedzi:
Nie jest wymagana CURSOR, WHILE loop ani funkcja zdefiniowana przez użytkownika .
Wystarczy być kreatywnym z FOR XML i PATH.
[Uwaga: To rozwiązanie działa tylko w SQL 2005 i nowszych wersjach. Oryginalne pytanie nie określało używanej wersji.]
źródło
Jeśli jest to SQL Server 2017 lub SQL Server Vnext, SQL Azure możesz użyć string_agg jak poniżej:
źródło
użycie ścieżki XML nie będzie idealnie konkatenować, jak można się spodziewać ... zastąpi „&” na „& amp;” i będzie również bałagan z
<" and ">
... może kilkoma innymi rzeczami, nie jestem pewien ... ale możesz spróbowaćNatrafiłem na obejście tego ... musisz zastąpić:
z:
... lub
NVARCHAR(MAX)
jeśli tego właśnie używasz.dlaczego, do diabła, nie
SQL
ma konkatenowanej funkcji agregującej? to jest PITA.źródło
Wpadłem na kilka problemów gdy próbowałem konwersji sugestię Kevin Fairchild do pracy z ciągi zawierające spacje i znaki specjalne XML (
&
,<
,>
), które zostały zakodowane.Ostateczna wersja mojego kodu (która nie odpowiada na oryginalne pytanie, ale może być dla kogoś przydatna) wygląda następująco:
Zamiast używać spacji jako separatora i zastępując wszystkie spacje przecinkami, po prostu uprzednio wstawia przecinek i spację do każdej wartości, a następnie używa
STUFF
do usunięcia pierwszych dwóch znaków.Kodowanie XML jest obsługiwane automatycznie przy użyciu dyrektywy TYPE .
źródło
Inna opcja korzystająca z Sql Server 2005 i nowszych
źródło
Zainstaluj SQLCLR Aggregates ze strony http://groupconcat.codeplex.com
Następnie możesz napisać taki kod, aby uzyskać wynik, o który prosiłeś:
źródło
SQL Server 2005 i nowsze wersje umożliwiają tworzenie własnych niestandardowych funkcji agregujących , w tym takich jak konkatenacja - zobacz przykład na dole połączonego artykułu.
źródło
Osiem lat później ... Aparat bazy danych Microsoft SQL Server vNext w końcu ulepszył Transact-SQL, aby bezpośrednio obsługiwał zgrupowanie łańcuchów ciągów. Community Technical Preview wersja 1.0 dodała funkcję STRING_AGG, a CTP 1.1 dodała klauzulę WITHIN GROUP dla funkcji STRING_AGG.
Odniesienie: https://msdn.microsoft.com/en-us/library/mt775028.aspx
źródło
To tylko dodatek do postu Kevina Fairchilda (bardzo sprytnie przy okazji). Dodałbym to jako komentarz, ale nie mam jeszcze wystarczającej liczby punktów :)
Użyłem tego pomysłu do widoku, nad którym pracowałem, jednak przedmioty, które konatynizowałem, zawierały spacje. Zmodyfikowałem więc nieco kod, aby nie używać spacji jako ograniczników.
Jeszcze raz dziękuję za fajne obejście Kevin!
źródło
Przykładem może być
W Oracle można użyć funkcji agregującej LISTAGG.
Oryginalne rekordy
Sql
Skutkować w
źródło
Tego rodzaju pytanie zadawane jest tutaj bardzo często, a rozwiązanie będzie w dużej mierze zależeć od podstawowych wymagań:
https://stackoverflow.com/search?q=sql+pivot
i
https://stackoverflow.com/search?q=sql+concatenate
Zwykle nie ma sposobu, aby to zrobić tylko w języku SQL bez dynamicznego SQL, funkcji zdefiniowanej przez użytkownika lub kursora.
źródło
Żeby dodać do tego, co powiedział Cade, jest to zwykle wyświetlacz front-end i dlatego należy się nim zająć. Wiem, że czasami łatwiej jest napisać coś w 100% w języku SQL dla takich rzeczy jak eksport plików lub inne rozwiązania „tylko SQL”, ale w większości przypadków ta konkatenacja powinna być obsługiwana w warstwie wyświetlania.
źródło
Nie potrzebujesz kursora ... wystarczy pętla while.
źródło
Zróbmy bardzo proste:
Zamień ten wiersz:
Z twoim zapytaniem.
źródło
nie widziałem odpowiedzi krzyżowych, również nie ma potrzeby ekstrakcji xml. Oto nieco inna wersja tego, co napisał Kevin Fairchild. Jest szybszy i łatwiejszy w użyciu w bardziej złożonych zapytaniach:
źródło
Możesz poprawić znaczącą wydajność w następujący sposób, jeśli grupa według zawiera głównie jeden element:
źródło
Korzystanie z funkcji Zamień i FOR JSON PATH
Aby uzyskać przykładowe dane i więcej sposobów, kliknij tutaj
źródło
Jeśli masz włączoną funkcję clr, możesz użyć biblioteki Group_Concat z GitHub
źródło