2013-08-08 5 views
5

Ich habe eine Tabelle von hierarchischen Daten, die ich als eine einzige, gruppiert XML-Wert wählen versuche:SQL Server: Zweistufige GROUP BY mit XML-Ausgabe

Spalten: Id, Type, SubType, SubSubType

Beispieldaten:

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 

Für die obigen Daten, ich folgende xml ausgeben möchte:

<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> 

, d. H. Eine einzelne xml-Struktur, die alle Zeilen aus der obigen Tabelle enthält, gruppiert nach der ersten Spalte (Type) und weiter gruppiert nach der zweiten Spalte (SubType).

+0

Willkommen zu 'stackoverflow'. Gut beschrieben! Bitte teilen Sie den Beispielcode, den Sie bisher ausprobiert haben, damit andere Benutzer Ihnen helfen können. –

Antwort

9
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') 
+0

ding ding ding! Das hat den Trick gemacht. Ich musste die zwei inneren Auswahlen CAST TO XML, aber die Ergebnisse sind perfekt. Vielen Dank! – gice

+0

@ user1822597 Sie sollten die Besetzung nicht benötigen. Hast du 'type' vergessen? –

+0

Aus irgendeinem Grund gab Typ mir einen Syntaxfehler? – gice

1
select 
    T1.Type as name, 
    (
    select 
     T2.SubType as name, 
     (
      select T3.SubSubType as name 
      from Table1 as T3 
      where T3.Type = T1.Type and T3.SubType = T2.SubType 
      for xml raw('SubSubType'), type 
     ) 
    from (select distinct Type, SubType from Table1) as T2 
    where T1.Type = T2.Type 
    for xml raw('SubType'), type 
    ) 
from (select distinct Type from Table1) as T1 
for xml raw('Type'), root('AllTypes') 

sql fiddle demo

+0

Ich habe das auch versucht, aber die akzeptierte Antwort gibt eine schönere xml-Struktur wegen der GROUP BYs. – mkataja