2017-06-30 22 views
9

Tôi có yêu cầu như dưới đây.Chuyển đổi hàng sang định dạng XML trong SQL Server

enter image description here

Và DDL và DML kịch bản cho hình ảnh trên là

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

Và tôi phải chuyển đổi kết quả trên sang định dạng xml như dưới đây (Output).

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  

Tôi mới đến XML để không thể thực hiện nhanh chóng. Tôi đã sử dụng giải pháp Marc_s với cross apply nhưng không thể đạt được.

Lưu ý: mục tiêu chính của tôi là, ở trên hình ảnh nếu chúng ta thấy có ba bản ghi cho ccp_details_sid đơn vì vậy tôi muốn chuyển đổi nó thành một hàng bằng cách sử dụng XML (đã đề cập ở trên).

+5

Một câu hỏi hay! Tôi đánh giá cao kịch bản * copy'n'pasteable *! +1 từ phía tôi – Shnugo

Trả lời

13

Sau đây sẽ làm việc cho bạn:

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; 

Nó chủ yếu được tất cả các giá trị duy nhất của bạn cho CCP_DETAILS_SID sử dụng:

SELECT t.CCP_DETAILS_SID 
FROM #Example AS t 
GROUP BY t.CCP_DETAILS_SID; 

Sau đó, cho mỗi một trong các giá trị sử dụng subquery tương quan để hình thành XML . Với các điểm chính là:

  • Sử dụng @ trước biệt hiệu để tạo thuộc tính, ví dụ: AS [@period_sid]
  • Sử dụng PATH('period_sid') để đặt tên vùng chứa cho mỗi hàng
  • Sử dụng ROOT('period') để đặt tên cho các nút ngoài.

Example on DBFiddle

4

Tôi sẽ sử dụng phương pháp sau đây:

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

Các vấn đề liên quan