2010-07-30 44 views
17

Tôi chắc chắn điều này đã được hỏi nhưng tôi không thể tìm thấy đúng cụm từ tìm kiếm.Kết hợp chuỗi nhóm/LISTAGG cho SQL Server

Cho một sơ đồ như thế này:

| CarMakeID | CarMake 
------------------------ 
|   1 | SuperCars 
|   2 | MehCars 

| CarMakeID | CarModelID | CarModel 
----------------------------------------- 
|   1 |   1 | Zoom 
|   2 |   1 | Wow 
|   3 |   1 | Awesome 
|   4 |   2 | Mediocrity 
|   5 |   2 | YoureSettling 

Tôi muốn tạo ra một tập dữ liệu như thế này:

| CarMakeID | CarMake | CarModels 
--------------------------------------------- 
|   1 | SuperCars | Zoom, Wow, Awesome 
|   2 | MehCars | Mediocrity, YoureSettling 

Tôi phải làm gì ở vị trí của 'AGG' cho chuỗi trong SQL Server trong truy vấn kiểu sau đây?

SELECT *, 
(SELECT AGG(CarModel) 
    FROM CarModels model 
    WHERE model.CarMakeID = make.CarMakeID 
    GROUP BY make.CarMakeID) as CarMakes 
FROM CarMakes make 

Trả lời

11

http://www.simple-talk.com/sql/t-sql-programming/concatenating-row-values-in-transact-sql/

Đây là một vấn đề thú vị trong Transact SQL, mà có một số giải pháp và cuộc tranh luận đáng kể. Làm thế nào để bạn đi về sản xuất một kết quả tóm tắt trong đó một cột phân biệt từ mỗi hàng trong mỗi thể loại cụ thể được liệt kê trong một cột 'tổng hợp'? Một cách đơn giản và trực quan để hiển thị dữ liệu rất khó đạt được. Anith Sen đưa ra một bản tóm tắt các cách khác nhau, và cung cấp lời cảnh báo trên một trong những bạn chọn ...

+1

Wow không tầm thường. –

+2

Bài viết cần cập nhật - CLR dành cho SQL Server 2005. 2008 hỗ trợ nhiều tham số trong hàm tổng hợp, vì vậy bạn có thể tạo lại các tham số của GROUP_CONCAT của MySQL. –

+0

@OMG Ngựa: bạn có thể giải thích thêm hoặc liên kết không? Không hoàn toàn chắc chắn ý của bạn là gì ... – gbn

4

Nếu đó là SQL Server 2017 hoặc SQL Server vNext, cơ sở dữ liệu SQL Azure bạn có thể sử dụng String_agg như sau:

SELECT make.CarMakeId, make.CarMake, 
     CarModels = string_agg(model.CarModel, ', ') 
FROM CarModels model 
    INNER JOIN CarMakes make 
    ON model.CarMakeId = make.CarMakeId 
GROUP BY make.CarMakeId, make.CarMake 

Output:

+-----------+-----------+---------------------------+ 
| CarMakeId | CarMake |   CarModels   | 
+-----------+-----------+---------------------------+ 
|   1 | SuperCars | Zoom, Wow, Awesome  | 
|   2 | MehCars | Mediocrity, YoureSettling | 
+-----------+-----------+---------------------------+ 
Các vấn đề liên quan