【问题标题】:TSQL: Return elements of a group as XMLTSQL:以 XML 形式返回组的元素
【发布时间】:2020-06-30 20:06:44
【问题描述】:

我尝试将每组的值聚合到一个 XML 中。我在 SQL Server 2016 上。

我的原始数据看起来像这样(这里严格说明问题。我的真实值不是通用的。):

create table #data (group_id int, value1 char(10), value2 char(10), value3 char(10));

insert #data values 
(1,'a1', 'b1', 'c1'),
(1,'a2', 'b2', 'c2'),
(1,'a3', 'b3', 'c3'),
(2,'a4', 'b4', 'c4');

我正在寻找一个可以返回一个 XML(每组)的聚合函数

select 
  group_id,
  **my_XML_aggregation** as [XML-values]
from #data
group by group_id

第一组 (group_id = 1) 的预期结果 XML 应如下所示(元素名称与问题无关)

<group>
   <row>
     <value1>a1<value1>
     <value2>b1<value1>
     <value3>c1<value1>
  </row>
   <row>
     <value1>a2<value1>
     <value2>b2<value1>
     <value3>c2<value1>
  </row>
   <row>
     <value1>a3<value1>
     <value2>b3<value1>
     <value3>c3<value1>
  </row>
</group>

我知道如何聚合以模式分隔的字符串。这不会完成这项工作。即使将模式聚合的字符串放入一个 XML 元素中也是没有选择的。我正在寻找 XML 中的结构化信息。

【问题讨论】:

    标签: sql-server xml tsql sql-server-2016 select-for-xml


    【解决方案1】:

    试试这样:

    drop table if exists #data ;
    
    create table #data (group_id int, value1 varchar(10), value2 varchar(10), value3 varchar(10));
    
    insert #data values 
    (1,'a1', 'b1', 'c1'),
    (1,'a2', 'b2', 'c2'),
    (1,'a3', 'b3', 'c3'),
    (2,'a4', 'b4', 'c4');
    
    with groups as
    (
      select distinct group_id from #data 
    )
    select group_id,
           (
             select value1, value2, value3
             from #data
             where group_id = groups.group_id
             for xml path, root('group'), type
           ) group_doc
    from groups 
    

    输出

    group_id    group_doc
    ----------- ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    1           <group><row><value1>a1</value1><value2>b1</value2><value3>c1</value3></row><row><value1>a2</value1><value2>b2</value2><value3>c2</value3></row><row><value1>a3</value1><value2>b3</value2><value3>c3</value3></row></group>
    2           <group><row><value1>a4</value1><value2>b4</value2><value3>c4</value3></row></group>
    

    【讨论】:

    • 好答案,我这边+1!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-09-27
    • 1970-01-01
    • 2012-12-06
    • 1970-01-01
    • 1970-01-01
    • 2020-11-07
    • 1970-01-01
    相关资源
    最近更新 更多