Dưới đây là một ví dụ thực tế khác hoạt động tốt ít nhất với bản phát hành năm 2008 (và sau này).
Đây là truy vấn ban đầu trong đó sử dụng đơn giản max()
để có được ít nhất một trong các giá trị:
SELECT option_name, Field_M3_name, max(Option_value) AS "Option value", max(Sorting) AS "Sorted"
FROM Value_list group by Option_name, Field_M3_name
ORDER BY option_name, Field_M3_name
Phiên bản cải tiến, trong đó cải thiện chính là chúng ta hiển thị tất cả các giá trị dấu phẩy tách ra:
SELECT from1.keys, from1.option_name, from1.Field_M3_name,
Stuff((SELECT DISTINCT ', ' + [Option_value] FROM Value_list from2
WHERE COALESCE(from2.Option_name,'') + '|' + COALESCE(from2.Field_M3_name,'') = from1.keys FOR XML PATH(''),TYPE)
.value('text()[1]','nvarchar(max)'),1,2,N'') AS "Option values",
Stuff((SELECT DISTINCT ', ' + CAST([Sorting] AS VARCHAR) FROM Value_list from2
WHERE COALESCE(from2.Option_name,'') + '|' + COALESCE(from2.Field_M3_name,'') = from1.keys FOR XML PATH(''),TYPE)
.value('text()[1]','nvarchar(max)'),1,2,N'') AS "Sorting"
FROM ((SELECT DISTINCT COALESCE(Option_name,'') + '|' + COALESCE(Field_M3_name,'') AS keys, Option_name, Field_M3_name FROM Value_list)
-- WHERE
) from1
ORDER BY keys
Lưu ý rằng chúng tôi đã giải quyết tất cả các sự cố có thể xảy ra NULL
trường hợp mà tôi có thể nghĩ đến và chúng tôi cũng đã khắc phục lỗi mà chúng tôi nhận được cho các giá trị số (phân loại trường).
Phiên bản ** nào của SQL Server ?? –
có thể trùng lặp của [SQL Server: Tôi có thể Comma Delimit nhiều hàng vào một cột?] (Http://stackoverflow.com/questions/2046037/sql-server-can-i-comma-delimit-multiple-rows-into- một cột) và: http://stackoverflow.com/questions/1817985/how-do-i-create-a-comma-separated-list-using-a-sql-query –
đã trả lời nhiều lần ... nhưng xem ra, không phải tất cả các triển khai ghép nối FOR XML PATH sẽ xử lý đúng các ký tự đặc biệt XML (<, &, >, v.v.) giống như câu trả lời của tôi cho câu trả lời trước sẽ: http://stackoverflow.com/questions/5031204/does-t-sql-have- a-aggregate-function-to-concatenate-strings/5031297 # 5031297 –