【问题标题】:TSQL: FOR XML PATH('') Failing To GroupTSQL:FOR XML PATH('') 未能分组
【发布时间】: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 articlethis 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


    【解决方案1】:

    我认为您的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
    

    SQL Fiddle with Demo。结果是:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-24
      • 1970-01-01
      相关资源
      最近更新 更多