Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Помогите с FOR XML  [new]
vontraumen
Member

Откуда:
Сообщений: 29
Коллеги, подскажите, пожалуйста.
Необходимо получить такой результат:

Пример №1
<Note Model="1" Color="Blue">
  <Order>
    <productNumber>VE-C304-S</productNumber>
    <Name>Classic Vest, S</Name>
  </Order>
  <Order>
    <productNumber>VE-C304-M</productNumber>
    <Name>Classic Vest, M</Name>
  </Order>
  <Order>
    <productNumber>VE-C304-L</productNumber>
    <Name>Classic Vest, L</Name>
  </Order>
</Note>
<Note Model="2" Color="Multi">
  <Order>
    <productNumber>CA-1098</productNumber>
    <Name>AWC Logo Cap</Name>
  </Order>
  <Order>
    <productNumber>GL-F110-S</productNumber>
    <Name>Full-Finger Gloves, S</Name>
  </Order>
</Note>


Пишу следующий запрос:
SELECT ProductModelID AS [@Model]
      ,Color AS [@Color]
	  ,ProductNumber AS [Order/productNumber]
	  ,Name AS [Order/Name]
FROM [Production].[Product]
WHERE ProductModelID IS NOT NULL
AND Color IS NOT NULL
ORDER BY ProductModelID,Color
FOR XML PATH ('Note')


Но на выходе одинаковые модели для каждого заказа:

Пример №2
<Note Model="1" Color="Blue">
  <Order>
    <productNumber>VE-C304-S</productNumber>
    <Name>Classic Vest, S</Name>
  </Order>
</Note>
<Note Model="1" Color="Blue">
  <Order>
    <productNumber>VE-C304-M</productNumber>
    <Name>Classic Vest, M</Name>
  </Order>
</Note>
<Note Model="1" Color="Blue">
  <Order>
    <productNumber>VE-C304-L</productNumber>
    <Name>Classic Vest, L</Name>
  </Order>
</Note>
<Note Model="2" Color="Multi">
  <Order>
    <productNumber>CA-1098</productNumber>
    <Name>AWC Logo Cap</Name>
  </Order>
</Note>
<Note Model="3" Color="Black">
  <Order>
    <productNumber>GL-F110-S</productNumber>
    <Name>Full-Finger Gloves, S</Name>
  </Order>
</Note>



Вопрос: как сгруппировать Orders внутри одинаковых Notes, как на примере №1?
7 авг 14, 21:31    [16414227]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с FOR XML  [new]
invm
Member

Откуда: Москва
Сообщений: 9827
vontraumen
Вопрос: как сгруппировать Orders внутри одинаковых Notes, как на примере №1?
select
 ProductModelID as [@Model]
 ,Color as [@Color]
 ,o.x as [Order]
from
 (select distinct ProductModelID, Color from [Production].[Product] where ProductModelID is not null and Color is not null) t cross apply
 (select ProductNumber, Name from [Production].[Product] where ProductModelID = t.ProductModelID for xml path(''), type) o(x)
for xml path ('Note'), type;
7 авг 14, 22:25    [16414407]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с FOR XML  [new]
vontraumen
Member

Откуда:
Сообщений: 29
invm, огромное спасибо!
7 авг 14, 22:33    [16414445]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с FOR XML  [new]
vontraumen
Member

Откуда:
Сообщений: 29
Только один момент, по запросу выводится результат, как на примере 3:

Пример 3:

<Note Model="4" Color="Black">
  <Order>
    <ProductNumber>GL-H102-S</ProductNumber>
    <Name>Half-Finger Gloves, S</Name>
    <ProductNumber>GL-H102-M</ProductNumber>
    <Name>Half-Finger Gloves, M</Name>
    <ProductNumber>GL-H102-L</ProductNumber>
    <Name>Half-Finger Gloves, L</Name>
  </Order>
</Note>


а нужно, чтобы Order открывался и закрывался на каждый заказ:

Пример 4:

<Note Model="4" Color="Black">
  <Order>
    <ProductNumber>GL-H102-S</ProductNumber>
    <Name>Half-Finger Gloves, S</Name>
</Order>
  <Order>
    <ProductNumber>GL-H102-M</ProductNumber>
    <Name>Half-Finger Gloves, M</Name>
</Order>
<Order>
    <ProductNumber>GL-H102-L</ProductNumber>
    <Name>Half-Finger Gloves, L</Name>
  </Order>
</Note>


Для этого я во вложенном запросе изменяю for xml path(' ') на for xml path('Order'), но как избавиться от общего Order, коим мы именуем все содержимое заказа? Понимаю, что можно переименовать, но интересует, как от этого тэга избавиться вообще, оставив его содержимое, чтобы было, как на примере 4.

select
 ProductModelID as [@Model]
 ,Color as [@Color]
 ,o.x as [Order] -- Как вывести содержимое Order, но с без одноименного тэга?
from
 (select distinct ProductModelID, Color 
 from [Production].[Product] 
 where ProductModelID is not null and Color is not null
 ) t cross apply
 (select ProductNumber, Name 
  from [Production].[Product] 
  where ProductModelID = t.ProductModelID for xml path('Order'), type) o(x) -- Вместо ' ' ставим 'Order'
for xml path ('Note'), type;
7 авг 14, 23:23    [16414636]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с FOR XML  [new]
invm
Member

Откуда: Москва
Сообщений: 9827
o.x as [*]
7 авг 14, 23:30    [16414661]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с FOR XML  [new]
invm
Member

Откуда: Москва
Сообщений: 9827
Можно еще посмотреть в сторону for xml explicit.
7 авг 14, 23:38    [16414697]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с FOR XML  [new]
vontraumen
Member

Откуда:
Сообщений: 29
invm, просто жму руку.
Спасибо за помощь в решении прикладной задачи новичку в FOR XML.
Экстраполировал теорию на реальные данные.
7 авг 14, 23:39    [16414704]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить