SQL Server 2005 - 嵌套 XML
SQL Server 2005 - Nested XML
我以此 question/answer 作为起点。 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>,211</FieldValue></Field>
<Field><FieldName>Total current period</FieldName><FieldValue>,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>,211</FieldValue></Field>
<Field><FieldName>Total current period</FieldName><FieldValue>,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>,211</FieldValue></Field>
<Field><FieldName>Total current period</FieldName><FieldValue>,215</FieldValue></Field>
</TotalSales>
</CategoryName>
</TwoColumnsChart>
</AccountData>
我的 #TempTable
将是我从数据仓库构建的自定义 table,因此我首先使用了一些示例数据。有没有比我现在做的更容易到达 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。对于任何感兴趣的人,这是用于在 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 路径('Accounts')
我以此 question/answer 作为起点。 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>,211</FieldValue></Field>
<Field><FieldName>Total current period</FieldName><FieldValue>,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>,211</FieldValue></Field>
<Field><FieldName>Total current period</FieldName><FieldValue>,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>,211</FieldValue></Field>
<Field><FieldName>Total current period</FieldName><FieldValue>,215</FieldValue></Field>
</TotalSales>
</CategoryName>
</TwoColumnsChart>
</AccountData>
我的 #TempTable
将是我从数据仓库构建的自定义 table,因此我首先使用了一些示例数据。有没有比我现在做的更容易到达 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。对于任何感兴趣的人,这是用于在 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 路径('Accounts')