0

Northwind を使用して、Google マップ アプリケーションの実際のデータで必要になると思われる SQL をモデル化しています。クエリは適切に機能していると思いますが、XML で返されると、階層が必要な方法ではありません。

SELECT   Marker.CustomerID
    ,Marker.CompanyName
    ,Marker.TotalAmount
    ,o.OrderID
    ,o.Freight
FROM     
    (
            SELECT   c.CustomerID
            ,c.CompanyName
            ,c.Address
            ,COUNT(o.freight) as TotalOrders
            ,SUM(o.freight) as TotalAmount
            FROM     Customers c
             INNER JOIN Orders o
               ON c.CustomerID = o.CustomerID
                where c.CustomerID = 'ALFKI' or c.CustomerID = 'ANTON'
                group by c.CustomerID
                        ,c.CompanyName
                        ,c.Address
    ) AS Marker                         

     INNER JOIN Orders o
       ON Marker.CustomerID = o.CustomerID
where Marker.CustomerID = 'ALFKI' or Marker.CustomerID = 'ANTON'
order by 1
for xml auto, root('root')

返される XML は次のとおりです。

<root>
<c CustomerID="ALFKI" CompanyName="Alfreds Futterkiste">
 <Marker TotalAmount="225.5800">
  <o OrderID="10643" Freight="29.4600" />
  <o OrderID="10692" Freight="61.0200" />
  <o OrderID="10702" Freight="23.9400" />
  <o OrderID="10835" Freight="69.5300" />
  <o OrderID="10952" Freight="40.4200" />
  <o OrderID="11011" Freight="1.2100" />
 </Marker>
</c>
<c CustomerID="ANTON" CompanyName="Antonio Moreno Taquería">
 <Marker TotalAmount="268.5200">
  <o OrderID="10365" Freight="22.0000" />
  <o OrderID="10507" Freight="47.4500" />
  <o OrderID="10535" Freight="15.6400" />
  <o OrderID="10573" Freight="84.8400" />
  <o OrderID="10677" Freight="4.0300" />
  <o OrderID="10682" Freight="36.1300" />
  <o OrderID="10856" Freight="58.4300" />
 </Marker>
</c>
</root>

cを顧客テーブルのエイリアスとして使用するサブクエリは、XML では不要です。まだ、注文と顧客の両方にあるため、CustomerIDがあいまいになるため、必要なようです。以下のモックアップのように、マーカー内でoのみを表示する方法を知りたいです。

<root>
<Marker CustomerID="ALFKI" CompanyName="Alfreds Futterkiste" TotalAmount="225.5800">
  <o OrderID="10643" Freight="29.4600" />
  <o OrderID="10692" Freight="61.0200" />
  <o OrderID="10702" Freight="23.9400" />
  <o OrderID="10835" Freight="69.5300" />
  <o OrderID="10952" Freight="40.4200" />
  <o OrderID="11011" Freight="1.2100" />
</Marker>
4

2 に答える 2

0

通常、OPのようにサブクエリを使用する方が少し「クール」だといつも思っていましたが、コメントされているように、@DVTのCTEのアイデアは同じXMLを生成したので、次のように書き直しました。サブクエリを回避して一時テーブルにデータを入力することで、必要に応じて XML 階層内の要素を取得できました。

CREATE TABLE #TempMarkers
(
    CustomerID nchar(5) NOT NULL,
    CompanyName nvarchar(40) NOT NULL,
    Address nvarchar(60) NULL,
    TotalOrders int NULL,
    TotalAmount money NULL
)
INSERT INTO #TempMarkers
(CustomerID
,CompanyName
,Address
,TotalOrders
,TotalAmount
)
SELECT  c.CustomerID
        ,c.CompanyName
        ,c.Address
        ,COUNT(o.freight) as TotalOrders
        ,SUM(o.freight) as TotalAmount
        FROM     Customers c
         INNER JOIN Orders o
           ON c.CustomerID = o.CustomerID
            where c.CustomerID = 'ALFKI' or c.CustomerID = 'ANTON'
            group by c.CustomerID
                    ,c.CompanyName
                    ,c.Address
SELECT   Marker.CustomerID
        ,Marker.CompanyName
        ,Marker.TotalAmount
        ,Marker.TotalOrders
        ,o.OrderID
        ,o.Freight
FROM #TempMarkers Marker     
     INNER JOIN Orders o
       ON Marker.CustomerID = o.CustomerID
where Marker.CustomerID = 'ALFKI' or Marker.CustomerID = 'ANTON'
order by 1
for xml auto, root('root')
于 2017-01-09T19:35:04.963 に答える
-1

cteを使用するのはどうですか。

WITH Marker AS (
    SELECT   c.CustomerID
    ,c.CompanyName
    ,c.Address
    ,COUNT(o.freight) as TotalOrders
    ,SUM(o.freight) as TotalAmount
    FROM     Customers c
     INNER JOIN Orders o
       ON c.CustomerID = o.CustomerID
        where c.CustomerID = 'ALFKI' or c.CustomerID = 'ANTON'
        group by c.CustomerID
                ,c.CompanyName
                ,c.Address
)
SELECT   Marker.CustomerID
,Marker.CompanyName
,Marker.TotalAmount
,o.OrderID
,o.Freight
FROM  Marker                         
INNER JOIN Orders o
   ON Marker.CustomerID = o.CustomerID
where Marker.CustomerID = 'ALFKI' or Marker.CustomerID = 'ANTON'
order by 1
for xml auto, root('root')
于 2017-01-07T00:43:44.723 に答える