9

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

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

根据这篇文章这篇文章(请注意,第二篇文章省略了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

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

4

1 回答 1

9

我认为您的WHERE子句使用了错误的列,您想使用Classnot 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

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

|      CLASS |          ANIMALS |
---------------------------------
| Asteroidea |         Starfish |
|   Mammalia |   Cat,Coyote,Dog |
|   Reptilia | Crocodile,Lizard |
于 2013-04-05T21:17:23.710 回答