Đây là một cách thực sự xấu để tạo HTML theo cách thủ công. Có một lý do chính đáng mà điều này không thuộc về SQL Server. Tôi chắc chắn rằng một số chuyên gia XML sẽ đến và làm tôi bối rối với một phương pháp đơn giản hơn nhiều (Tôi đã chơi với Giải pháp củaSimon Sabin nhưng không thể dịch nó theo yêu cầu của bạn), nhưng hiện tại:
DECLARE @x TABLE(Gender VARCHAR(6), Age INT, Name VARCHAR(32));
INSERT @x VALUES ('Male', 30, 'Bill'), ('Female', 27, 'Jenny'),
('Female', 27, 'Debby'), ('Male', 44, 'Frank');
DECLARE @html NVARCHAR(MAX) = N'';
;WITH x AS ( SELECT x.Age, x.Gender, x.Name,
dr = DENSE_RANK() OVER (PARTITION BY x.Gender ORDER BY x.Age),
gn = ROW_NUMBER() OVER (PARTITION BY x.Gender ORDER BY x.Age),
rn = ROW_NUMBER() OVER (ORDER BY x.Gender DESC, x.Age)
FROM @x AS x ) SELECT @html +=
CHAR(13) + CHAR(10) + CASE WHEN c1.gn = 1 THEN
CASE WHEN c1.rn > 1 THEN '</li></ul></li></ul>' ELSE '' END + '<ul><li>'
+ c1.Gender ELSE '' END + CHAR(13) + CHAR(10) + CHAR(9)
+ CASE WHEN c1.gn = 1 OR c1.Age <> c3.Age THEN
CASE WHEN c1.gn > 1 THEN '</li>' ELSE '<ul>' END + '<li>'
+ CONVERT(VARCHAR(32), c1.Age) ELSE '' END + CHAR(13) + CHAR(10) + CHAR(9)
+ CHAR(9) + CASE WHEN (c1.gn = 1 OR c1.Age <> c3.Age) THEN '<ul>' ELSE '' END
+ '<li>' + c1.Name + '</li>' + CASE WHEN c1.Age <> c2.Age OR c1.dr <> c2.dr
THEN '</ul>' ELSE '' END
FROM x AS c1
LEFT OUTER JOIN x AS c2
ON c1.rn = c2.rn - 1
LEFT OUTER JOIN x AS c3
ON c1.rn = c3.rn + 1
ORDER BY c1.Gender DESC, c1.Age;
SELECT @html += '</ul></li></ul></li></ul>';
PRINT @html; -- note you will need to deal with this
-- in another way if the string is large
Kết quả - không chính xác những gì bạn yêu cầu về khoảng trắng, nhưng hiển thị HTML giống hệt nhau:
<ul><li>Male
<ul><li>30
<ul><li>Bill</li></ul>
</li><li>44
<ul><li>Frank</li></ul>
</li></ul></li></ul><ul><li>Female
<ul><li>27
<ul><li>Jenny</li>
<li>Debby</li></ul></li></ul></li></ul>
CHỈNH SỬA Để có một giải pháp gọn gàng hơn nhiều, cũng như nhiều kịch tính và một minh chứng tốt về lý do tại sao @ZeeTee là người dùng khó chịu nhất trên StackOverflow, hãy xem giải pháp của Mikael cho câu hỏi tiếp theo:
Trả lại câu lệnh chọn dưới dạng HTML được định dạng (SQL 2005)