【问题标题】:SQL Server 2005 - Nested XMLSQL Server 2005 - 嵌套 XML
【发布时间】:2016-12-23 17:38:33
【问题描述】:

我以这个问题/答案为起点。 SQL Server : nesting elements with FOR XML PATH

我正在尝试获取此输出。

<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

【问题讨论】:

    标签: xml sql-server-2005


    【解决方案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('Accounts')

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多