Pytanie GROUP BY, aby połączyć / połączyć kolumnę [duplicate]


To pytanie już zawiera odpowiedź:

Mam tabelę w następujący sposób:

ID  User  Activity  PageURL  
 1  Me    act1      ab     
 2  Me    act1      cd     
 3  You   act2      xy     
 4  You   act2      st

Chcę pogrupować według użytkowników i działań, tak, że kończę z czymś takim jak:

User  Activity  PageURL  
Me    act1      ab, cd     
You   act2      xy, st

Jak widać, kolumna PageURL jest połączona ze sobą, oddzielona przecinkiem na podstawie grupy.

Naprawdę doceniam wszelkie wskazówki i porady.


76
2018-03-01 09:42


pochodzenie


Potrzebna jest funkcja, której potrzebujesz group_concat w MySQL. Nie wiem, czy istnieje odpowiednik w SQLServer, możesz sprawdzić to pytanie: Funkcja SQL group_concat w SQL Server. - Xavi López
To nie jest tak proste, jak mogłoby się wydawać - stackoverflow.com/questions/194852/... - RobJohnson
Nie są trudne ani przez standardy SQL. Dobry odnośnik @RobJohnson - samthebrand


Odpowiedzi:


SELECT
     [User], Activity,
     STUFF(
         (SELECT DISTINCT ',' + PageURL
          FROM TableName
          WHERE [User] = a.[User] AND Activity = a.Activity
          FOR XML PATH (''))
          , 1, 1, '')  AS URLList
FROM TableName AS a
GROUP BY [User], Activity

144
2018-03-01 09:45



Miły! Aby rozwinąć: używasz STUFF() aby usunąć pierwszy przecinek połączonego ciągu PageUrl. Sam łańcuch PageUrl jest tworzony za pomocą FOR XML PATH(), z pustą ścieżką, aby połączyć odzyskane PageUrls. Całkiem sprytnie :) Niektóre źródła: STUFF():  msdn.microsoft.com/en-us/library/ms188043.aspx  FOR XML:  simple-talk.com/sql/learn-sql-server/... - Deruijter
Jest to skuteczna odpowiedź na pytanie użytkownika. Byłoby jednak znacznie lepiej, gdybyś wyjaśnił, co dzieje się w zapytaniu i dlaczego dokładnie działa. - Eric J.
Dodano klauzulę DISTINCT, aby uniknąć powtarzających się adresów URL strony dla tego samego użytkownika - Rashmi Pandit
@RashmiPandit Dziękujemy za dodanie DISTINCT - Rahul Nikate
Dlaczego ta prośba trwa wiecznie? Czas na wyjście. - samthebrand


Dobre pytanie. Trzeba powiedzieć, że zajęło to trochę czasu. Oto mój wynik.

DECLARE @TABLE TABLE
(  
ID INT,  
USERS VARCHAR(10),  
ACTIVITY VARCHAR(10),  
PAGEURL VARCHAR(10)  
)

INSERT INTO @TABLE  
VALUES  (1, 'Me', 'act1', 'ab'),
        (2, 'Me', 'act1', 'cd'),
        (3, 'You', 'act2', 'xy'),
        (4, 'You', 'act2', 'st')


SELECT T1.USERS, T1.ACTIVITY,   
        STUFF(  
        (  
        SELECT ',' + T2.PAGEURL  
        FROM @TABLE T2  
        WHERE T1.USERS = T2.USERS  
        FOR XML PATH ('')  
        ),1,1,'')  
FROM @TABLE T1  
GROUP BY T1.USERS, T1.ACTIVITY

6
2018-03-01 12:01



Powinieneś dodać AND T1.ACTIVITY = T2.ACTIVITY w zapytaniu wewnętrznym, w przeciwnym razie otrzymasz niepoprawny wynik dla niektórych danych. - Ogrish Man