2011-11-04 40 views
46

Tôi có một truy vấn SQL như thế này;Máy chủ SQL: kết hợp nhiều hàng thành một hàng

SELECT * 
FROM Jira.customfieldvalue 
WHERE CUSTOMFIELD = 12534 
AND ISSUE = 19602 

Và đó là kết quả;

enter image description here

Những gì tôi muốn là; hiển thị trong một hàng (ô) kết hợp tất cả các số STRINGVALUE và chúng được phân tách bằng dấu phẩy. Như thế này;

SELECT --some process with STRINGVALUE-- 
FROM Jira.customfieldvalue 
WHERE CUSTOMFIELD = 12534 
AND ISSUE = 19602 

Araç Listesi (C2, K1 vb.Belgeler; yoksa Ruhsat Fotokopileri), Min. 5 
araç plakası için İnternet Sorgusu, Son 3 Yıla Ait Onaylı Yıl Sonu 
Bilanço + Gelir Tablosu, Son Yıl (Yıl Sonuna ait) Detay Mizanı, İçinde 
Bulunduğumuz Yıla ait Ara Dönem Geçici Vergi Beyannamesi, Bayi Yorum 
E-Maili, Proforma Fatura 

Tôi làm như thế nào?

+0

aka làm thế nào để vi phạm 1NF tức này là không dễ dàng để làm trong SQL (mùi) do thiết kế vì nó liên quan tạo ra một kết quả phi quan hệ. Thay vào đó, hãy làm điều này trong công cụ báo cáo, mã giao diện người dùng, v.v. – onedaywhen

Trả lời

65

Có một số phương pháp.

Nếu bạn muốn chỉ là chuỗi giá trị hợp nhất trở lại, đây là một cách nhanh chóng và dễ dàng tiếp cận tốt

DECLARE @combinedString VARCHAR(MAX) 
SELECT @combinedString = COALESCE(@combinedString + ', ', '') + stringvalue 
FROM jira.customfieldValue 
WHERE customfield = 12534 
    AND ISSUE = 19602 

SELECT @combinedString as StringValue 

nào sẽ trở lại chuỗi kết hợp của bạn.

Bạn cũng có thể thử một trong các phương pháp XML, ví dụ:

SELECT DISTINCT Issue, Customfield, StringValues 
FROM Jira.customfieldvalue v1 
CROSS APPLY (SELECT StringValues + ',' 
       FROM jira.customfieldvalue v2 
       WHERE v2.Customfield = v1.Customfield 
        AND v2.Issue = v1.issue 
       ORDER BY ID 
        FOR XML PATH('')) D (StringValues) 
WHERE customfield = 12534 
    AND ISSUE = 19602 
9

Có một phương pháp tiện lợi cho điều này trong MySql được gọi là GROUP_CONCAT. Một tương đương cho SQL Server không tồn tại, nhưng bạn có thể viết của riêng bạn bằng cách sử dụng SQLCLR. May mắn là someone đã làm điều đó cho bạn.

truy vấn của bạn sau đó biến thành này (mà btw là một cú pháp đẹp hơn nhiều):

SELECT CUSTOMFIELD, ISSUE, dbo.GROUP_CONCAT(STRINGVALUE) 
FROM Jira.customfieldvalue 
WHERE CUSTOMFIELD = 12534 AND ISSUE = 19602 
GROUP BY CUSTOMFIELD, ISSUE 

Nhưng xin lưu ý rằng phương pháp này là tốt trong ít nhất 100 dòng trong một nhóm. Ngoài ra, bạn sẽ gặp phải các vấn đề về hiệu suất lớn. Các tập hợp SQLCLR phải tuần tự hóa bất kỳ kết quả trung gian nào và nhanh chóng chồng chất lên khá nhiều công việc. Giữ nó trong tâm trí!

Điều thú vị là FOR XML không bị cùng một vấn đề mà thay vào đó sử dụng cú pháp khủng khiếp đó.

+0

Tôi có một tình huống trong đó chỉ nhóm hai hoặc ba hàng ở mức tối đa, vì vậy điều này hoàn hảo cho tôi trong sự đơn giản của nó. Nhìn thấy câu trả lời này là một vài năm tuổi, có hiệu suất của phương pháp này được cải thiện? – Christian

12

Bạn có thể đạt được điều này là kết hợp Đối với đường dẫn XML và STUFF như sau:

SELECT (STUFF((
     SELECT ', ' + StringValue 
     FROM Jira.customfieldvalue 
     WHERE CUSTOMFIELD = 12534 
     AND ISSUE = 19602 
     FOR XML PATH('') 
     ), 1, 2, '') 
    ) AS StringValue 
1

Sử dụng MySQL chức năng inbuilt group_concat() sẽ là một lựa chọn tốt để nhận được kết quả mong muốn. Cú pháp sẽ là -

SELECT group_concat(STRINGVALUE) 
FROM Jira.customfieldvalue 
WHERE CUSTOMFIELD = 12534 
AND ISSUE = 19602 

Trước khi bạn thực hiện lệnh ở trên chắc chắn rằng bạn tăng kích thước của group_concat_max_len khác của toàn bộ sản lượng có thể không phù hợp trong tế bào đó.

Để thiết lập giá trị của group_concat_max_len, thực hiện dưới đây Command-

SET group_concat_max_len = 50000; 

Bạn có thể thay đổi giá trị 50000 cho phù hợp, bạn tăng nó vào một giá trị cao hơn theo yêu cầu.

+0

Cảm ơn nhưng xin lỗi, câu hỏi của tôi là cho "T-SQL" như bạn có thể thấy. Câu trả lời của bạn là _also_ được bao gồm trong [Kết hợp nhiều hàng con vào một hàng MYSQL] (http://stackoverflow.com/q/1067428/447156) bằng cách này. –

1

Tôi tin cho cơ sở dữ liệu có hỗ trợ listagg chức năng, bạn có thể làm:

select id, issue, customfield, parentkey, listagg(stingvalue, ',') within group (order by id) 
from jira.customfieldvalue 
where customfield = 12534 and issue = 19602 
group by id, issue, customfield, parentkey 
Các vấn đề liên quan