2016-12-23 146 views
1

我以這個問題/答案爲出發點。 SQL Server : nesting elements with FOR XML PATHSQL Server 2005 - 嵌套XML

我在試圖得到這個輸出。

<Account ExID="Customer Numer 1"> 
<AccountData> 
    <TwoColumnsChart> 
      <CategoryName ID="Product Line 1"> 
       <ChartName>Prior vs current period sales for Product Line 1 </ChartName> 
      <ValuesDescriptions> 
       <Value1>Target</Value1> 
       <Value2>Actual</Value2> 
      </ValuesDescriptions> 
      <SalesByFields> 
       <Field><FieldName>Item</FieldName><FieldValue1>3100 (current Period)</FieldValue1><FieldValue2>2324 (prior Period)</FieldValue2></Field> 
       <Field><FieldName>Item</FieldName><FieldValue1>1244</FieldValue1><FieldValue2>1000</FieldValue2></Field> 
       <Field><FieldName>Item</FieldName><FieldValue1>2300</FieldValue1><FieldValue2>3000</FieldValue2></Field> 
       <Field><FieldName>Item</FieldName><FieldValue1>3100</FieldValue1><FieldValue2>2324</FieldValue2></Field> 
       <Field><FieldName>Item</FieldName><FieldValue1>1244</FieldValue1><FieldValue2>1000</FieldValue2></Field> 
       <Field><FieldName>Item</FieldName><FieldValue1>2300</FieldValue1><FieldValue2>3000</FieldValue2></Field> 
      </SalesByFields> 
       <TotalSales> 
        <Field><FieldName>Total prior period</FieldName><FieldValue>$32,211</FieldValue></Field> 
        <Field><FieldName>Total current period</FieldName><FieldValue>$24,215</FieldValue></Field> 
       </TotalSales> 
      </CategoryName> 
      <CategoryName ID="Product Line 2"> 
       <ChartName>Prior vs current period sales for Product Line 2</ChartName> 
      <ValuesDescriptions> 
       <Value1>Target</Value1> 
       <Value2>Actual</Value2> 
      </ValuesDescriptions> 
      <SalesByFields> 
       <Field><FieldName>Item</FieldName><FieldValue1>1244</FieldValue1><FieldValue2>1000</FieldValue2></Field> 
       <Field><FieldName>Item</FieldName><FieldValue1>2300</FieldValue1><FieldValue2>3000</FieldValue2></Field> 
       <Field><FieldName>Item</FieldName><FieldValue1>3100</FieldValue1><FieldValue2>2324</FieldValue2></Field> 
       <Field><FieldName>Item</FieldName><FieldValue1>1244</FieldValue1><FieldValue2>1000</FieldValue2></Field> 
       <Field><FieldName>Item</FieldName><FieldValue1>2300</FieldValue1><FieldValue2>3000</FieldValue2></Field> 
      </SalesByFields> 
       <TotalSales> 
        <Field><FieldName>Total prior period</FieldName><FieldValue>$32,211</FieldValue></Field> 
        <Field><FieldName>Total current period</FieldName><FieldValue>$24,215</FieldValue></Field> 
       </TotalSales> 
      </CategoryName> 
      <CategoryName ID="Product Line 3"> 
       <ChartName>Prior vs current period sales for Product Line 3</ChartName> 
      <ValuesDescriptions> 
       <Value1>Target</Value1> 
       <Value2>Actual</Value2> 
      </ValuesDescriptions> 
      <SalesByFields> 
       <Field><FieldName>Item</FieldName><FieldValue1>1244</FieldValue1><FieldValue2>1000</FieldValue2></Field> 
       <Field><FieldName>Item</FieldName><FieldValue1>2300</FieldValue1><FieldValue2>3000</FieldValue2></Field> 
       <Field><FieldName>Item</FieldName><FieldValue1>3100</FieldValue1><FieldValue2>2324</FieldValue2></Field> 
       <Field><FieldName>Item</FieldName><FieldValue1>1244</FieldValue1><FieldValue2>1000</FieldValue2></Field> 
       <Field><FieldName>Item</FieldName><FieldValue1>2300</FieldValue1><FieldValue2>3000</FieldValue2></Field> 
      </SalesByFields> 
       <TotalSales> 
        <Field><FieldName>Total prior period</FieldName><FieldValue>$32,211</FieldValue></Field> 
        <Field><FieldName>Total current period</FieldName><FieldValue>$24,215</FieldValue></Field> 
       </TotalSales> 
      </CategoryName>  
     </TwoColumnsChart> 
</AccountData> 

#TempTable將是一個自定義的表我從數據倉庫建設,所以我先用一些樣本數據。有沒有更容易的方法來到XML然後我在做什麼?

CREATE TABLE #TempTable 
(
    [FieldName] char(15), 
    [FieldValue1] char(15), 
    [FieldValue2] char(15), 
    [CategoryName] char(15), 
    [Customer] char(15) 
) 

INSERT INTO #TempTable([FieldName], [FieldValue1], [FieldValue2], [CategoryName], [Customer]) 
VALUES ('Test1Cust1', '100', '150', 'ProductLine1', 'Customer1') 

INSERT INTO #TempTable([FieldName], [FieldValue1], [FieldValue2], [CategoryName], [Customer]) 
VALUES ('Test1Cust1', '100', '15110', 'ProductLine1', 'Customer1') 

INSERT INTO #TempTable([FieldName], [FieldValue1], [FieldValue2], [CategoryName], [Customer]) 
VALUES ('Test1Cust2', '100', '150', 'ProductLine1', 'Customer2') 

INSERT INTO #TempTable([FieldName], [FieldValue1], [FieldValue2], [CategoryName], [Customer]) 
VALUES ('Test1Cust2', '110', '15110', 'ProductLine1', 'Customer2') 

INSERT INTO #TempTable([FieldName], [FieldValue1], [FieldValue2], [CategoryName], [Customer]) 
VALUES ('Tes2Cust1', '200', '250', 'ProductLine2', 'Customer1') 

INSERT INTO #TempTable([FieldName], [FieldValue1], [FieldValue2], [CategoryName], [Customer]) 
VALUES ('Tes2Cust2', '200', '250', 'ProductLine2', 'Customer2') 

INSERT INTO #TempTable([FieldName], [FieldValue1], [FieldValue2], [CategoryName], [Customer]) 
VALUES ('Test3Cust1', '300', '350', 'ProductLine3', 'Customer1') 

INSERT INTO #TempTable([FieldName], [FieldValue1], [FieldValue2], [CategoryName], [Customer]) 
VALUES ('Test3Cust2', '300', '350', 'ProductLine3', 'Customer2') 

INSERT INTO #TempTable([FieldName], [FieldValue1], [FieldValue2], [CategoryName], [Customer]) 
VALUES ('Test4Cust1', '400', '450', 'ProductLine4', 'Customer1') 

INSERT INTO #TempTable([FieldName], [FieldValue1], [FieldValue2], [CategoryName], [Customer]) 
VALUES ('Test4Cust2', '400', '450', 'ProductLine4', 'Customer2') 

SELECT 
    (SELECT 
     RTRIM(T1.Customer) AS "@ExID", 
     (SELECT 
       RTRIM(T2.CategoryName) AS "@ID", 
       (SELECT 
        RTRIM(T3.FieldName) AS FieldName, 
        RTRIM(T3.FieldValue1) AS FieldValue1, 
        RTRIM(T3.FieldValue2) AS FieldValue2 
       FROM 
        #TempTable T3 
       WHERE 
        T2.categoryname = T3.CategoryName 
        AND T2.Customer = T3.Customer 
       FOR XML path('Field'), root('SalesByFields'), type) 
      FROM 
       #TempTable AS T2 
      WHERE 
       T1.Customer = T2.Customer 
      GROUP BY 
       T2.CategoryName, T2.Customer 
      FOR XML path('CategoryName'), type) 
    FROM 
     #TempTable AS T1 
    GROUP BY 
     T1.Customer 
    FOR XML path('Account'), TYPE) 
FOR XML path('Accounts') 

DROP TABLE #TempTable 

回答

1

這就是我想到的,它是以我需要的方式構建XML的。對於任何感興趣的人,這是用於加載Pepperi移動軟件的儀表板報告。

SELECT (
    SELECT RTRIM(T1.Customer) AS "@ExID", 
      (
       SELECT RTRIM(T2.CategoryName) AS "@ID" 
         , 'Prior vs current period sales for ' + RTRIM(T2.CategoryName) AS "ChartName" 
         , 'Target' AS "ValuesDescription/Value1" 
         , 'Actual' AS "ValuesDescription/Value2" 
         , 
         (
          SELECT RTRIM(T3.FieldName) AS FieldName 
            , SUM(T3.FieldValue1) AS FieldValue1 
            , SUM(T3.FieldValue2) AS FieldValue2 
          FROM #TempTable T3 
          WHERE T2.categoryname = T3.CategoryName AND 
            T2.Customer = T3.Customer 
          GROUP BY T3.FieldName 
          FOR XML PATH('Field') 
           ,ROOT('SalesByFields') 
           ,TYPE 
         ) 
         , 
         (
          SELECT T4.FieldName AS FieldName 
            , SUM(T4.FieldValue) AS FieldValue 
          FROM #CurVsPrior T4 
          WHERE T2.Customer = T4.AddressID AND 
            T2.CategoryName = T4.Brand 
          GROUP BY T4.FieldName 
          FOR XML PATH('Field') 
           ,ROOT('TotalSales') 
           ,TYPE 
         ) 
       FROM #TempTable AS T2 
       WHERE T1.Customer = T2.Customer 
       GROUP BY T2.CategoryName, T2.Customer 
       FOR XML PATH('CategoryName') 
        ,TYPE 
      ) AS "AccountData/TwoColumnsChart" 
    FROM #TempTable AS T1 
    GROUP BY T1.Customer 
    FOR XML PATH('Account') 
     ,TYPE 
    ) 

FOR XML PATH( '帳戶')