TSQL:FOR XML PATH('')无法分组

Que*_*CPO 9 t-sql sql-server-2008-r2 for-xml-path

我正在尝试使用FOR XML PATH('')TSQL 按特定列对列值进行分组.这是两种情况下的结果(请注意,没有XML代码 - 即:SELECT * FROM @xml- 与XML代码相同):

Class          |     Animals
=================================
Asteroidea     |     Starfish
Mammalia       |     Dog
Mammalia       |     Cat
Mammalia       |     Coyote
Reptilia       |     Crocodile
Reptilia       |     Lizard
Run Code Online (Sandbox Code Playgroud)

根据这篇文章这篇文章(请注意,第二篇文章遗漏了GROUP BY,我不确定作者如何设法在没有它的情况下解决这个问题 - 我已经尝试过它只生成所有值),语法应该是如下图所示:

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
Run Code Online (Sandbox Code Playgroud)

几个小时后,在这些例子和上面的代码之间,我没有看到我在语法上的错误,但我收到错误"列'@ xml.Animal'在选择列表中无效,因为它不是包含在聚合函数或GROUP BY子句中." 请注意,如果我不使用GROUP BY子句,它仍然不会以适当的方式生成值.另一组眼睛会很有用.

Tar*_*ryn 9

我觉得你有你WHERE用错列条款,您要使用ClassAnimal:

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
Run Code Online (Sandbox Code Playgroud)

请参阅SQL Fiddle with Demo.结果是:

|      CLASS |          ANIMALS |
---------------------------------
| Asteroidea |         Starfish |
|   Mammalia |   Cat,Coyote,Dog |
|   Reptilia | Crocodile,Lizard |
Run Code Online (Sandbox Code Playgroud)