Câu hỏi GROUP BY để kết hợp / concat một cột [trùng lặp]


Câu hỏi này đã có câu trả lời ở đây:

Tôi có một bảng như sau:

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

Tôi muốn nhóm theo Người dùng và Hoạt động sao cho tôi kết thúc bằng một thứ như:

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

Như bạn có thể thấy, cột PageURL được kết hợp với nhau bằng dấu phẩy dựa trên nhóm theo.

Thực sự sẽ đánh giá cao bất kỳ gợi ý và lời khuyên nào.


76
2018-03-01 09:42


gốc


Hàm bạn cần được gọi là group_concat trong MySQL. Tôi không biết nếu có một tương đương trong SQLServer, bạn có thể kiểm tra câu hỏi này: Hàm SQL group_concat trong SQL Server. - Xavi López
Nó không đơn giản như bạn nghĩ - stackoverflow.com/questions/194852/… - RobJohnson
Không khó bằng chuẩn SQL. Tài liệu tham khảo tốt @RobJohnson - samthebrand


Các câu trả lời:


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



Tốt đẹp! Để xây dựng: bạn đang sử dụng STUFF() để xóa dấu phẩy đầu tiên của chuỗi PageUrl được ghép nối. Chuỗi PageUrl được tạo bằng cách sử dụng FOR XML PATH(), với một đường dẫn trống, để nối các PageUrl được truy xuất. Khá thông minh :) Một số nguồn: STUFF():  msdn.microsoft.com/en-us/library/ms188043.aspx  FOR XML:  simple-talk.com/sql/learn-sql-server/… - Deruijter
Đây là câu trả lời hiệu quả cho câu hỏi của người dùng. Tuy nhiên, nó sẽ là một câu trả lời tốt hơn nhiều nếu bạn sẽ giải thích những gì đang xảy ra trong truy vấn và tại sao chính xác nó hoạt động. - Eric J.
Đã thêm mệnh đề DISTINCT để tránh các url trang lặp lại cho cùng một người dùng - Rashmi Pandit
@RashmiPandit Cảm ơn bạn đã thêm DISTINCT - Rahul Nikate
Tại sao truy vấn này dùng mãi mãi cho tôi? Hết giờ. - samthebrand


Một câu hỏi hay. Nên cho bạn biết nó mất một thời gian để crack này. Đây là kết quả của tôi.

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



Bạn nên thêm AND T1.ACTIVITY = T2.ACTIVITY trong truy vấn bên trong, nếu không bạn sẽ nhận được kết quả không chính xác cho một số dữ liệu. - Ogrish Man