2013-08-08 4 views
5

मुझे लगता है कि मैं एक एकल, वर्गीकृत किया एक्सएमएल मूल्य के रूप में चयन करने के लिए कोशिश कर रहा हूँ श्रेणीबद्ध डेटा की एक तालिका है:एसक्यूएल सर्वर: एक्सएमएल उत्पादन के साथ दो स्तर ग्रुप द्वारा

कॉलम: 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 
उपरोक्त डेटा के लिए

, मैं उत्पादन के लिए निम्न एक्सएमएल चाहते हैं:

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

यानी एक एकल एक्सएमएल संरचना जिसमें उपरोक्त तालिका से सभी पंक्तियां होती हैं, जो पहले कॉलम (प्रकार) द्वारा समूहित होती हैं, और आगे दूसरे कॉलम (सबटाइप) द्वारा समूहित होती हैं।

+0

'stackoverflow' में आपका स्वागत है। अच्छी तरह से वर्णित! कृपया नमूना कोड साझा करें जिसे आपने अभी तक आजमाया है ताकि अन्य उपयोगकर्ता आसानी से आपकी सहायता कर सकें। –

उत्तर

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

डिंग डिंग डिंग! वह चाल है। मुझे दो आंतरिक चयनों को एक्सएमएल करना था, लेकिन परिणाम सही हैं। धन्यवाद! – gice

+0

@ user1822597 आपको कलाकारों की आवश्यकता नहीं है। क्या आप 'टाइप' भूल गए थे? –

+0

किसी कारण से, मुझे एक वाक्यविन्यास त्रुटि दी? – 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

मैंने यह भी कोशिश की, लेकिन स्वीकृत उत्तर ग्रुप बीईएस के कारण निकर एक्सएमएल संरचना देता है। – mkataja

संबंधित मुद्दे