【发布时间】:2013-04-05 21:11:41
【问题描述】:
我正在尝试在 TSQL 中使用 FOR XML PATH('') 按特定列对列值进行分组。这是两种情况下的结果(请注意,不带 XML 代码 - 即:SELECT * FROM @xml - 与带 XML 代码相同):
Class | Animals
=================================
Asteroidea | Starfish
Mammalia | Dog
Mammalia | Cat
Mammalia | Coyote
Reptilia | Crocodile
Reptilia | Lizard
根据this article 和this article(请注意,第二篇文章省略了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 子句,它仍然不会以适当的方式生成值。另一双眼睛会很有用。
【问题讨论】:
标签: tsql sql-server-2008-r2 for-xml-path