SQL Server:带XML输出的两级GROUP BY

gic*_*ice 6 sql sqlxml sql-server-2008

我有一个分层数据表,我试图选择作为单个分组的XML值:

列: Id, Type, SubType, SubSubType

样本数据:

Id  Type                    Subtype                    SubSubType
1   Product Documentation   Brochures                  Functional Brochures
2   Product Documentation   Brochures                  Fliers
3   Product Documentation   Data Sheets and Catalogs   Data Sheets
4   Product Documentation   Data Sheets and Catalogs   Catalogs
5   Other Documentation     Other classification       User Guides
Run Code Online (Sandbox Code Playgroud)

对于上面的数据,我想输出以下xml:

<AllTypes>
    <Type name="Product Documentation">
        <SubType name="Brochures">
            <SubSubType name="Functional Brochures"/>
            <SubSubType name="Fliers"/>
        </SubType>
        <SubType name="Data Sheets and Catalogs">
            <SubSubType name="Data Sheets"/>
            <SubSubType name="Catalogs"/>
        </SubType>
    </Type>
    <Type name="Other Documentation">
        <SubType name="Other classification">
            <SubSubType name="User Guides"/>
        </SubType>
    </Type>
</AllTypes>
Run Code Online (Sandbox Code Playgroud)

即包含上表中所有行的单个xml结构,按第一列(Type)分组,并进一步按第二列(SubType)分组.

Mik*_*son 12

declare @T table
(
  ID int,
  Type varchar(30),
  SubType varchar(30),
  SubSubType varchar(30)
)

insert into @T values
(1, 'Product Documentation', 'Brochures',                'Functional Brochures'),
(2, 'Product Documentation', 'Brochures',                'Fliers'),
(3, 'Product Documentation', 'Data Sheets and Catalogs', 'Data Sheets'),
(4, 'Product Documentation', 'Data Sheets and Catalogs', 'Catalogs'),
(5, 'Other Documentation',   'Other classification',     'User Guides')

select T1.Type as '@Name',
       (
       select T2.SubType as '@Name',
              (
              select T3.SubSubType as '@Name'
              from @T as T3
              where T3.SubType = T2.SubType and
                    T3.Type = T1.Type
              for xml path('SubSubType'), type
              )
       from @T as T2
       where T2.Type = T1.Type
       group by T2.SubType
       for xml path('SubType'), type
       )
from @T as T1
group by Type
for xml path('Type'), root('AllTypes')
Run Code Online (Sandbox Code Playgroud)

  • 我的不好 - 我在这篇文章中使用的列名是虚构的,而"Type"是一个糟糕的选择.您的解决方案完美无瑕.再次感谢! (2认同)