【问题标题】:group by xml in for xml clause在 for xml 子句中按 xml 分组
【发布时间】:2016-01-28 07:36:09
【问题描述】:

我正在尝试根据我的查询创建一个 xml。我的表结构是:

   ReportDate   Rating  Currency    Spreads
    8/8/2014    B        EUR 1.0    280
    9/8/2014    A        USD 2.0    220
    10/8/2014   A        USD 2.0    330
    9/8/2014    B        EUR 1.0    170

创建表格的脚本:

CREATE TABLE [dbo].[SampleTable](
    [ReportDate] datetime,
    [Rating] [nchar](2) NOT NULL,
    [Currency] [varchar](50) NOT NULL,
    [Spreads] [varchar](50) NOT NULL
)

GO

INSERT INTO Person VALUES (8/8/2014,'B','EUR 1.0','280');
INSERT INTO Person VALUES (9/8/2014,'A','USD 2.0',220);
INSERT INTO Person VALUES (10/8/2014,'A','USD 2.0','330');
INSERT INTO Person VALUES (9/8/2014,'B','EUR 2.0',170);

去 我试图输出的 xml 结构是:

<Spread_Series>
    <Spreads  Region="EURO 1.0" OrigRating="B">
        <Spread Period="201408" AvgValue="280" />
        <Spread Period="201209" AvgValue="170" />
    </Spreads>
    <Spreads  Region="USD 2.0" OrigRating="A">
        <Spread Period="201409" AvgValue="220" />
        <Spread Period="201210" AvgValue="330" />
    </Spreads>
</Spread_Series>

我使用的查询是:

SELECT 
        (SELECT distinct reportdate AS "@Period" ,spreads AS "@AvgValue"
        FROM [cs].[spreads_clo]
        for xml path('Spread'), TYPE)
    FROM sampletable
    FOR XML PATH('Spread_Series'), ROOT('Reponse')

我无法在输出中获得这部分 xml:

<Spreads  Region="EURO 1.0" OrigRating="B">

我的查询的输出是:

<Spread_Series>
    <Spreads>
        <Spread Period="201408" AvgValue="280" />
        <Spread Period="201209" AvgValue="170" />
    </Spreads>
    <Spreads>
        <Spread Period="201409" AvgValue="220" />
        <Spread Period="201210" AvgValue="330" />
    </Spreads>
</Spread_Series>

如何按查询分组以获取 xml 结构?

【问题讨论】:

  • 能否也包括当前查询尝试的输出?您正在使用我认为大多数 SO 用户不太熟悉的 SQL Server 领域。
  • 添加了我的查询输出
  • 阅读How to post a T-SQL question on a public forum。让那些想帮助你的人轻松一点。

标签: sql-server for-xml


【解决方案1】:

查询 -

DECLARE @t TABLE (
    ReportDate DATETIME,
    Rating NCHAR(2) NOT NULL,
    Currency VARCHAR(50) NOT NULL,
    Spreads VARCHAR(50) NOT NULL
)

INSERT INTO @t
VALUES
      ('20140808', 'B', 'EUR 1.0', '280')
    , ('20140809', 'A', 'USD 2.0', '220')
    , ('20140810', 'A', 'USD 2.0', '330')
    , ('20140809', 'B', 'EUR 1.0', '170')

SELECT [@Region] = t1.Currency, [@OrigRating] = t1.Rating, (
    SELECT DISTINCT [@Period] = ReportDate,
                    [@AvgValue] = Spreads
    FROM @t t2
    WHERE t1.Rating = t1.Rating
        AND t2.Currency = t1.Currency
    FOR XML PATH ('Spread'), TYPE
)
FROM (
    SELECT DISTINCT Rating, Currency
    FROM @t
) t1
FOR XML PATH ('Spread_Series')

输出 -

<Spread_Series Region="USD 2.0" OrigRating="A ">
  <Spread Period="2014-08-09T00:00:00" AvgValue="220" />
  <Spread Period="2014-08-10T00:00:00" AvgValue="330" />
</Spread_Series>
<Spread_Series Region="EUR 1.0" OrigRating="B ">
  <Spread Period="2014-08-08T00:00:00" AvgValue="280" />
  <Spread Period="2014-08-09T00:00:00" AvgValue="170" />
</Spread_Series>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-07
    • 1970-01-01
    相关资源
    最近更新 更多