Ну, это немного сложно ...
Попробуйте этот запрос:
Я создаю автономный тестовый сценарий (для будущих вопросов): попробуйте указать такой MCVE в своем вопросе)
DECLARE @tblInv TABLE(InvID INT,Seller VARCHAR(100),Buyer VARCHAR(100),[Date] DATE);
INSERT INTO @tblInv VALUES(1,'Seller 1','Buyer 1','20180101')
,(2,'Seller 2','Buyer 2','20180202');
DECLARE @tblPos TABLE(PosID INT, InvID INT, PositionNumber INT, ItemName VARCHAR(100),Quantity INT,Price DECIMAL(14,4));
INSERT INTO @tblPos VALUES(1,1,1,'Item 1 in 1',11,1.1)
,(2,1,2,'Item 2 in 1',12,1.2)
,(3,2,1,'Item 1 in 2',21,2.1)
,(4,2,2,'Item 2 in 2',22,2.2)
,(5,2,3,'Item 3 in 2',23,2.3);
- Запрос присваивает результат переменной @Result
DECLARE @Result NVARCHAR(MAX)=
(
SELECT CONCAT('InvID|Seller|Buyer|Date|Sum',CHAR(13) + CHAR(10)
,i.InvID,'|'
,i.Seller,'|'
,i.Buyer,'|'
,i.[Date],'|'
,(SELECT SUM(Price) FROM @tblPos x WHERE x.InvID=i.InvID),CHAR(13) + CHAR(10)
,'PositionNumber|ItemName|Quantity|Price',CHAR(13) + CHAR(10)
,(
SELECT CONCAT(p.PositionNumber,'|'
,p.ItemName,'|'
,p.Quantity,'|'
,p.Price,CHAR(13) + CHAR(10))
FROM @tblPos p
WHERE p.InvID=i.InvID
ORDER BY p.PositionNumber
FOR XML PATH(''),TYPE).value('.','nvarchar(max)')
)
FROM @tblInv i
FOR XML PATH(''),TYPE
).value('.','nvarchar(max)');
- Это напечатаетрезультат (используйте PRINT или выберите результаты в текст )
PRINT @Result;
Результат
InvID|Seller|Buyer|Date|Sum
1|Seller 1|Buyer 1|2018-01-01|2.3000
PositionNumber|ItemName|Quantity|Price
1|Item 1 in 1|11|1.1000
2|Item 2 in 1|12|1.2000
InvID|Seller|Buyer|Date|Sum
2|Seller 2|Buyer 2|2018-02-02|6.6000
PositionNumber|ItemName|Quantity|Price
1|Item 1 in 2|21|2.1000
2|Item 2 in 2|22|2.2000
3|Item 3 in 2|23|2.3000
Вы можете использовать BCP
, чтобы записать это в файл,Есть много примеров (один здесь )