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子句,它仍然不会以适当的方式生成值.另一组眼睛会很有用.
我觉得你有你WHERE用错列条款,您要使用Class不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
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)
| 归档时间: |
|
| 查看次数: |
8518 次 |
| 最近记录: |