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

Откуда:
Сообщений: 12
С проблемой выгрузки данных в XML я столкнулась впервые и сразу прошу тапками не кидать, и если это где-то уже было, просто перенаправить туда.
База MSSQl 2014
Необходимо из нее сделать XML-файл следующей структуры:
	<doc>
<doccode>накладная1</doccode>
<num>0001</num>
<attribut1>...</attribut1>
<attribu2t>...</attribut1>
...
<body>
<item>
<tovar>Товар1</tovar>
<quantity>1</quantity>
<price>500.00</price>
</item>
<item>
<tovar>Товар2</tovar>
<quantity>2</quantity>
<price>2000.00</price>
</item>
...
</body>
<doccode>накладная2</doccode>
...
Данные хранятся в одной таблице фактов. Для каждого товара в таблице хранятся все данные из шапки документа. Попробовала разные варианты, получилось применить FOR XML PATH
SELECT 
      [doc_id] as doccode
      ,[doc_no] as num
        ...
      ,[nomenk_id] as "body/item/tovar"
      ,[kol] as "body/item/quantity"
      ,[price] as "body/item/price"
  FROM [dbo].[tbl_fact]
  where priznak=3
    FOR XML path ('doc')

И у меня получилось следующее:
	<doc>
<doccode>накладная1</doccode>
<num>0001</num>
<attribut1>...</attribut1>
<attribu2t>...</attribut1>
...
<body>
<item>
<tovar>Товар1</tovar>
<quantity>1</quantity>
<price>500.00</price>
</item>
</body>
<doccode>накладная1</doccode>
...
<body>
<item>
<tovar>Товар2</tovar>
<quantity>2</quantity>
<price>2000.00</price>
</item>
</body>
...
Как можно переписать запрос так, чтобы все товары, принадлежащие к одной накладной были под нее сгруппированы?
22 мар 18, 15:47    [21278043]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь по XML  [new]
Konst_One
Member

Откуда:
Сообщений: 11512
сделайте пример с вашими входящими данными, а то лень сочинять за вас
22 мар 18, 15:51    [21278060]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь по XML  [new]
Konst_One
Member

Откуда:
Сообщений: 11512
select 
...
(
select 
   items.nomenk_id as tovar, ...
FROM tbl_fact items
FOR XML PATH('item'), root('body'), elements, type
)
FOR XML PATH('doc')
22 мар 18, 15:56    [21278081]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь по XML  [new]
Konst_One
Member

Откуда:
Сообщений: 11512
select 
      [doc_id] as 'doccode'
      ,[doc_no] as 'num'
     ...
(
select 
   items.nomenk_id as 'tovar', 
   items.[kol] as 'quantity',
   items.[price] as 'price'
FROM tbl_fact items
FOR XML PATH('item'), root('body'), elements, type
)
FROM [dbo].[tbl_fact]
Where priznak=3
FOR XML path ('doc')


дальше сами
22 мар 18, 16:02    [21278120]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь по XML  [new]
Katrine_S
Member

Откуда:
Сообщений: 12
Таблица фактов выглядит следующим образом, если вы об этом:

doc_id | doc_no | date | contragent |.... | nomenk_id | kol | price
| Накладная1 | 0001 | 01-02-18 | ИП Пупкин | ... | Товар 1 | 5 | 100-00
| Накладная1 | 0001 | 01-02-18 | ИП Пупкин | ... | Товар 2 | 10 | 200-00
| Накладная1 | 0001 | 01-02-18 | ИП Пупкин | ... | Товар 3 | 2 | 500-00
| Накладная2 | 0002 | 05-02-18 | ООО Мир | ... | Товар 4 | 3 | 300-00
| Накладная2 | 0002 | 05-02-18 | ООО Мир | ... | Товар 1 | 1 | 150-00

22 мар 18, 16:03    [21278127]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь по XML  [new]
Konst_One
Member

Откуда:
Сообщений: 11512
нет,я о чём то таком:
declare @t table (id int, ...)

insert into @t (id, ...)
values (...), (...)
22 мар 18, 16:05    [21278134]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь по XML  [new]
AlanDenton
Member [скрыт]

Откуда:
Сообщений: 1004
DECLARE @t TABLE (doc_id NVARCHAR(100), doc_no NVARCHAR(100), nomenk_id NVARCHAR(100), kol INT, price MONEY)
INSERT INTO @t
VALUES (N'Накладная1', N'0001', N'Товар 1', 5 , 100)
     , (N'Накладная1', N'0001', N'Товар 2', 10, 200)
     , (N'Накладная1', N'0001', N'Товар 3', 2 , 500)
     , (N'Накладная2', N'0002', N'Товар 4', 3 , 300)
     , (N'Накладная2', N'0002', N'Товар 1', 1 , 150)

SELECT *
, (
    SELECT tovar = t2.nomenk_id
         , quantity = t2.kol
         , t2.price
    FROM @t t2
    WHERE t2.doc_id = t.doc_id
    FOR XML PATH ('item'), ROOT('body'), TYPE
)
FROM (
    SELECT DISTINCT doc_id, doc_no
    FROM @t
) t
FOR XML PATH ('doc'), ROOT('docs')

Кроме того советую посмотреть видео (вам это поможет в дальнейшем при работе с XML):
+ ссылка
22 мар 18, 16:39    [21278303]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь по XML  [new]
Konst_One
Member

Откуда:
Сообщений: 11512
ну всю малину испортил =)
22 мар 18, 16:42    [21278315]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь по XML  [new]
AlanDenton
Member [скрыт]

Откуда:
Сообщений: 1004
Konst_One, сорри. Сейчас митинг, чтобы мозгами не поехать нужно было себя чем-то занять.
Katrine_S, изучайте матчасть :) XML штука крайне веселая
22 мар 18, 16:45    [21278324]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь по XML  [new]
Katrine_S
Member

Откуда:
Сообщений: 12
Спасибо огромное, помогло.
Вчера весь день читала эту самую матчасть...
Видео обязательно посомтрю
23 мар 18, 13:45    [21280732]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить