2013-06-18 63 views
7

Tôi đang chuyển một ứng dụng mà ban đầu tôi đã viết để chạy trên Apache bằng cách sử dụng PHP và cơ sở dữ liệu MySQL. Một trong các truy vấn đã sử dụng các hàm MySQL của Concat_WSGroup_Concat để nối đầu tiên một vài cột khác nhau thành một chuỗi và sau đó ghép tất cả các mục được nhóm lại với nhau theo mệnh đề Group_By.Hoàn tất Group_Concat của MYSQL trong SQL Server

Như một ví dụ:

ID Name Candy 
1  John M&Ms 
1  John KitKat 

Truy vấn:

Select Group_Concat(Concat_WS('-',Name, Candy) Separator '00--00') as UserCandy 
From ExampleTable 
Group By ID 

Kết quả:

UserCandy 
John-M&Ms00--00John-KitKat 

Bây giờ, tôi đang cố gắng để đạt được kết quả tương tự trong SQL Server 2008 sử dụng PHP 5.4+.

Những gì tôi đã cố gắng:

SELECT Stuff(name + ';' + candy, 1, 0, '-----') AS UserCandy 
FROM test 

Vấn đề can be seen in the fiddle that I have setup.

Kết quả dự kiến ​​sẽ là:

-----John;MMs-----John;KitKat 

Cuối cùng, điều này trở nên khó khăn hơn khi tôi bổ sung thêm cột để trộn. Tôi muốn kết hợp các kết quả (như được hiển thị ở trên) trong đó ID giống nhau. Điều này hoạt động rất tốt với group_concat vì nó sẽ tự động hợp nhất các hàng đã được nhóm lại với nhau.

+1

@bluefeet Tôi đã nhìn thấy câu hỏi đó, nhưng tôi đang cố tránh sử dụng XML. Tôi thực sự muốn giữ nguyên định dạng mà tôi đã sử dụng trong phiên bản trước của ứng dụng. –

+0

Có nhiều cách để lấy dữ liệu theo định dạng mà bạn muốn, nhưng trong máy chủ SQL, không có cách nào dễ dàng để nối dữ liệu từ nhiều hàng vào một hàng duy nhất. – Taryn

+1

@ bluefeet Vậy làm thế nào tôi có thể thay đổi câu hỏi này để nó được trả lời và không bị đóng? Tôi đã thực hiện một số lượng lớn đọc ngày hôm nay về chủ đề và tôi vẫn chưa nhận được nó bản thân mình (rõ ràng là tôi đang ở đây bây giờ) –

Trả lời

7

Điều này có thể được thực hiện bằng quy trình gồm hai bước.

Trước tiên, bạn có thể sử dụng Biểu thức bảng chung để thực hiện kết nối đầu tiên của namecandy. Phần đầu tiên sử dụng truy vấn:

;with cte as 
(
    select id, name+';'+ candy UserCandy 
    from table_test 
) 
select * 
from cte 

Xem Demo. Điều này sẽ cho kết quả là:

| ID | USERCANDY | 
-------------------- 
| 1 | John;MMs | 
| 1 | John;KitKat | 

Khi nối ban đầu được thực hiện, sau đó bạn có thể sử dụng FOR XML PATHSTUFF để có được kết quả cuối cùng:

;with cte as 
(
    select id, name+';'+ candy UserCandy 
    from table_test 
) 
select distinct c.id, 
    STUFF(
     (SELECT '-----' + c2.UserCandy 
      FROM cte c2 
      where c.id = c2.id 
      FOR XML PATH ('')) 
      , 1, 0, '') AS UserCandy 
from cte c; 

Xem SQL Fiddle with Demo. Điều này cho kết quả:

| ID |      USERCANDY | 
-------------------------------------- 
| 1 | -----John;MMs-----John;KitKat | 
+0

Tôi thực sự đánh giá cao câu trả lời này. Tôi sẽ cố gắng sử dụng nó với tập dữ liệu thực tế của tôi, tất nhiên là phức tạp hơn nhiều so với những gì tôi đã đăng. Tôi sẽ làm hết sức mình để làm cho nó hoạt động như mong đợi nhưng nếu tôi không thể, tôi sẽ đăng ở đây trong một vài. Cảm ơn một lần nữa. –

+0

Điều này làm việc hoàn hảo. Tôi không chắc chắn những gì tôi đã mất tích phải trung thực. Tôi nghĩ thực tế rằng các truy vấn được chia thành hai phần là những gì đã làm các trick. Tôi đánh giá cao bạn không vội vã để đóng này mặc dù câu trả lời được ra khỏi đó, như tôi đã không có may mắn với bất kỳ người trong số họ. –

+0

@Whathaveyoutried Tôi rất vui vì bạn đã làm việc đó. – Taryn

Các vấn đề liên quan