2017-07-05 16 views
5

Giả sử tôi có một bảng tạm thời mà trông như thế này:SQL Server - tham gia hàng vào dấu phẩy tách ra danh sách

+----+------+ 
| Id | Value| 
+----+------+  
| 1 | 1 | 
| 1 | 2 | 
| 1 | 3 | 
| 2 | 1 | 
| 2 | 2 | 
+----+------+ 

Và tôi muốn bàn của tôi là như thế này:

+----+----------+ 
    | Id | ValueList| 
    +----+----------+  
    | 1 | 1,2,3 | 
    | 2 | 1,2 | 
    +----+----------+ 

Vì vậy, về cơ bản Tôi cần nhóm các giá trị của mình dưới dạng danh sách được phân tách bằng dấu phẩy. Tôi đã thử như sau:

SELECT Id, STUFF((SELECT ',' + CAST(VALUE AS varchar) FROM @MyTable FOR XML PATH('')), 1 ,1, '') AS ValueList 
FROM @MyTable 
GROUP BY Id 

Nhưng tôi nhận được một cái gì đó như:

 +----+---------------------+ 
     | Id |  ValueList  | 
     +----+---------------------+  
     | 1 | 1,1,1,1,1,1,... | 
     +----+---------------------+ 

tôi không thể tìm thấy những gì tôi đang làm sai. Ai đó có thể trợ giúp với truy vấn này? Hoặc hướng tôi đi đúng hướng? Cảm ơn bạn.

+3

có thể trùng lặp của [? Làm thế nào để sử dụng GROUP BY để nối chuỗi trong SQL Server] (https://stackoverflow.com/questions/273238/how-to-use-group-by -to-concatenate-strings-in-sql-server) – Wanderer

Trả lời

8

Bạn đang thiếu điều kiện bên trong truy vấn phụ.

SELECT t2.Id, STUFF((SELECT ',' + CAST(VALUE AS varchar) FROM @MyTable t1 where t1.Id =t2.ID FOR XML PATH('')), 1 ,1, '') AS ValueList 
FROM @MyTable t2 
GROUP BY t2.Id 

Demo

+0

Thật vậy, tôi đã bỏ lỡ điều kiện. Cảm ơn vì sớm phản hồi. –

4

Một thay thế cho việc sử dụng GROUP BY trên Id sẽ được sử dụng chọn riêng biệt:

SELECT DISTINCT 
    Id, 
    STUFF((SELECT ',' + CAST(t2.VALUE AS varchar) 
      FROM @MyTable t2 
      WHERE t2.Id = t1.Id 
      FOR XML PATH('')), 1 ,1, '') AS ValueList 
FROM @MyTable t1 

Demo

+0

Đây có thể là một giải pháp tốt khác. Cảm ơn bạn. –

2

Hãy thử điều này:

create table #t(id int, value int) 
insert into #t values 
(1,1), 
(1,2), 
(1,3), 
(2,1), 
(2,2) 



SELECT t2.Id, 
STUFF((SELECT ',' + CAST(VALUE AS varchar) FROM #t t1 where t1.Id =t2.ID FOR XML PATH('')), 1 ,1, '') AS list 
FROM #t t2 
GROUP BY t2.Id 

đầu ra:

Id   list 
---  ------- 
1   1,2,3 
2   1,2 
Các vấn đề liên quan