2017-06-30 9 views
9

में पंक्तियों को एक्सएमएल प्रारूप में कनवर्ट करना मुझे नीचे की आवश्यकता है। ऊपर छवि के लिएएसक्यूएल सर्वर

enter image description here

और DDL और dml स्क्रिप्ट

CREATE TABLE #example 
    ([CCP_DETAILS_SID] int, [ACCOUNT_GROWTH] int, [PRODUCT_GROWTH] int, [PROJECTION_SALES] numeric(22,6), [PROJECTION_UNITS] numeric(22,6), [PERIOD_SID] int) 
; 

INSERT INTO #example 
    ([CCP_DETAILS_SID], [ACCOUNT_GROWTH], [PRODUCT_GROWTH], [PROJECTION_SALES], [PROJECTION_UNITS], [PERIOD_SID]) 
VALUES 
    (30001, 0, 0, 1505384.695, 18487.25251, 1801), 
    (30001, 0, 0, 1552809.983, 18695.75536, 1802), 
    (30001, 0, 0, 1595642.121, 18834.75725, 1803), 
    (30002, 0, 0, 10000.32, 18834.75725, 1801), 
    (30002, 0, 0, 1659124.98, 18834.75725, 1802), 
    (30002, 0, 0, 465859546.6, 18834.75725, 1803) 
; 

और मैं नीचे (आउटपुट) की तरह एक्सएमएल प्रारूप करने के लिए ऊपर दिए गए परिणामों कन्वर्ट करना होगा।

ccp_details_sid   xml_format_string 

30001      <period> 
          <period_sid period_sid=1801> 
          <PROJECTION_SALES>1505384.695</PROJECTION_SALES> 
          <PROJECTION_UNITS>18487.25251<PROJECTION_UNITS> 
          <ACCOUNT_GROWTH>0</ACCOUNT_GROWTH> 
          <PRODUCT_GROWTH>0</PRODUCT_GROWTH> 
          </period_sid> 
          <period_sid period_sid=1802> 
          <PROJECTION_SALES>1552809.983</PROJECTION_SALES> 
          <PROJECTION_UNITS>18695.75536<PROJECTION_UNITS> 
          <ACCOUNT_GROWTH>0</ACCOUNT_GROWTH> 
          <PRODUCT_GROWTH>0</PRODUCT_GROWTH> 
          </period_sid> 
          <period_sid period_sid=1802> 
          <PROJECTION_SALES>1595642.121</PROJECTION_SALES> 
          <PROJECTION_UNITS>18834.75725<PROJECTION_UNITS> 
          <ACCOUNT_GROWTH>0</ACCOUNT_GROWTH> 
          <PRODUCT_GROWTH>0</PRODUCT_GROWTH> 
          </period_sid> 
          </period> 

30002      Same like above  

मैं XML तो यह जल्दी से ऐसा करने में सक्षम नहीं किया जा सका करने के लिए नया हूँ। मैंने समाधान cross apply के साथ उपयोग किया है लेकिन इसे प्राप्त करने में सक्षम नहीं है।

नोट: मेरी प्रमुख लक्ष्य ऊपर छवि में, अगर हम देखते हैं एक ccp_details_sid के लिए तीन रिकॉर्ड तो मैं XML (जैसा कि ऊपर उल्लेख) का उपयोग कर एक पंक्ति के रूप में यह परिवर्तित करना चाहते हैं। का उपयोग कर CCP_DETAILS_SID के लिए

SELECT t.CCP_DETAILS_SID, 
     ( SELECT PERIOD_SID AS [@period_sid], 
        x.PROJECTION_SALES, 
        x.PROJECTION_UNITS, 
        x.ACCOUNT_GROWTH, 
        x.PRODUCT_GROWTH 
      FROM #Example AS x 
      WHERE x.CCP_DETAILS_SID = t.CCP_DETAILS_SID 
      FOR XML PATH('period_sid'), TYPE, ROOT('period') 
     ) AS xml_format_string 
FROM #Example AS t 
GROUP BY t.CCP_DETAILS_SID; 

यह अनिवार्य रूप से अपने सभी अनन्य मानों हो जाता है:

+5

एक अच्छा सवाल! मैं * copy'n'pasteable * स्क्रिप्ट की सराहना करता हूं! मेरी तरफ से +1 – Shnugo

उत्तर

13

निम्नलिखित आप के लिए काम करेंगे

SELECT t.CCP_DETAILS_SID 
FROM #Example AS t 
GROUP BY t.CCP_DETAILS_SID; 
इनमें से प्रत्येक मान के लिए

फिर सहसंबद्ध सबक्वेरी का उपयोग करता है एक्सएमएल के लिए फार्म । मुख्य बिंदुओं के साथ:

  • संपत्ति बनाने के लिए उपनाम के सामने @ का उपयोग करें, उदा। AS [@period_sid]
  • उपयोग PATH('period_sid') उपयोग ROOT('period') प्रत्येक पंक्ति के लिए
  • कंटेनर नाम के लिए बाहरी नोड्स नाम है।

Example on DBFiddle

4

मैं दृष्टिकोण निम्नलिखित का प्रयोग करेंगे:

SELECT * 
FROM (SELECT DISTINCT x.[CCP_DETAILS_SID] FROM #example x) y 
OUTER APPLY (
    SELECT (
     SELECT z.[PERIOD_SID]   AS '@period_sid', 
       z.[PROJECTION_SALES] AS 'PROJECTION_SALES', 
       z.[PROJECTION_UNITS] AS 'PROJECTION_UNITS', 
       z.[ACCOUNT_GROWTH]  AS 'ACCOUNT_GROWTH', 
       z.[PRODUCT_GROWTH]  AS 'PRODUCT_GROWTH' 
     FROM #example z 
     WHERE y.[CCP_DETAILS_SID] = z.[CCP_DETAILS_SID] 
     FOR XML PATH('period_sid'), ROOT('period'), TYPE 
    ) AS XmlResults 
) z 

Demo

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