2013-04-05 14 views
8

Tôi đang cố gắng nhóm các giá trị cột theo một cột cụ thể bằng cách sử dụng FOR XML PATH('') trong TSQL. Đây là kết quả trong cả hai trường hợp (lưu ý rằng không có XML mã - ví dụ: SELECT * FROM @xml - là giống như với mã XML):TSQL: FOR XML PATH ('') Không thành nhóm

Class   |  Animals 
================================= 
Asteroidea  |  Starfish 
Mammalia  |  Dog 
Mammalia  |  Cat 
Mammalia  |  Coyote 
Reptilia  |  Crocodile 
Reptilia  |  Lizard 

Theo this articlethis article (lưu ý rằng bài viết thứ hai lá ra GROUP BY, mà tôi chắc chắn về cách tác giả cố gắng kéo này off mà không có nó - tôi đã thử và nó chỉ tạo ra tất cả các giá trị), cú pháp nên được như hình dưới đây này:

DECLARE @xml TABLE(
    Animal VARCHAR(50), 
    Class VARCHAR(50) 
) 

INSERT INTO @xml 
VALUES ('Dog','Mammalia') 
    , ('Cat','Mammalia') 
    , ('Coyote','Mammalia') 
    , ('Starfish','Asteroidea') 
    , ('Crocodile','Reptilia') 
    , ('Lizard','Reptilia') 

SELECT x1.Class 
    , STUFF((SELECT ',' + x2.Animal AS [text()] 
    FROM @xml x2 
    WHERE x1.Animal = x2.Animal 
    ORDER BY x2.Animal 
    FOR XML PATH('')),1,1,'') AS "Animals" 
FROM @xml x1 
GROUP BY Class 

Sau một vài giờ, giữa các ví dụ này và mã ở trên, tôi không thấy mình sai về cú pháp, nhưng tôi nhận được ror "Cột" @ xml.Animal 'không hợp lệ trong danh sách chọn vì nó không được chứa trong hàm tổng hợp hoặc mệnh đề GROUP BY. " Lưu ý rằng nếu tôi bỏ qua mệnh đề GROUP BY, nó vẫn không tạo ra các giá trị theo cách thích hợp. Một bộ mắt khác sẽ hữu ích.

Trả lời

9

Tôi nghĩ rằng bạn có WHERE khoản của bạn bằng cách sử dụng cột sai, bạn muốn sử dụng Class không Animal:

SELECT x1.Class 
    , STUFF((SELECT ',' + x2.Animal AS [text()] 
    FROM @xml x2 
    WHERE x1.Class = x2.Class 
    ORDER BY x2.Animal 
    FOR XML PATH('')),1,1,'') AS "Animals" 
FROM @xml x1 
GROUP BY Class 

Xem SQL Fiddle with Demo. Kết quả là:

|  CLASS |   ANIMALS | 
--------------------------------- 
| Asteroidea |   Starfish | 
| Mammalia | Cat,Coyote,Dog | 
| Reptilia | Crocodile,Lizard |