В настоящее время я работаю над запросом SQL в T-SQL на SQL Server 2012 с целью объединения или объединения нескольких таблиц в одну таблицу и объединения нескольких строк. Пока все работает хорошо. Я использую STUFF и FOR XML PATH, чтобы объединить несколько строк в 1.
К сожалению, когда я хочу объединить мои 2 временные таблицы в одну итоговую таблицу результатов, объединенные (объединенные) строки снова исчезают.
Мои таблицы выглядят следующим образом:
Таблица #BasicOffers
OfferId | Tile | Manager | DeliveryVersionId |
----------+--------+----------+-------------------|
4 | Offer1 | John Doe | 1 |
5 | Offer2 | Jane Doe | 2 |
Таблица #TmpLabels
DeliveryVersionId | Label |
------------------+-------------------------+
1 | Service, Time, Material |
2 | Consulting, Time |
Конечный результат, к сожалению, не желаемый результат. временные таблицы снова кажутся разделенными:
OfferId | Title | Manager | Delivery
----------+--------+----------+------------------------
4 | Offer1 | John Doe | Service
4 | Offer1 | John Doe | Time
4 | Offer1 | John Doe | Material
5 | Offer2 | Jane Doe | Consulting
5 | Offer2 | Jane Doe | Time
Желаемый результат .
OfferId | Title | Manager | Delivery
----------+--------+----------+------------------------
4 | Offer1 | John Doe | Service, Time, Material
5 | Offer2 | Jane Doe | Consulting, Time
Мой запрос на объединение таблиц выглядит так:
-- Delivery Methods
SELECT [D].DeliveryVersionId, [DM].Label
INTO #TmpLabels
FROM [MySchema].[Delivery] [D]
INNER JOIN dbo.DeliveryMethods [DM] ON [DM].DeliveryMethodId = [D].DeliveryMethodId
SELECT DeliveryVersionId,
Label = STUFF(
(SELECT ',' + Label FROM #TmpLabels FOR XML PATH('')), 1, 1, ''
)
FROM #TmpLabels
GROUP BY DeliveryVersionId
-- FinalResults
SELECT [O].OfferId, [O].Title, [O].OfferManager, [DL].Label AS Delivery
FROM #BasicOffers [O]
INNER JOIN #TmpLabels [DL] ON [DL].DeliveryVersionId = [O].DeliveryVersionId
Я действительно не знаю, является ли это лучшим решением, чтобы сохранить все во временную таблицу, а затем объединить ее или выбрать все сразу.
В любом случае, к сожалению, мой запрос не работает правильно.
У вас есть идея, как решить эту проблему?
Большое спасибо!
2 ответа
;WITH BasicOffers(OfferId,Tile,Manager,DeliveryVersionId )
AS
(
SELECT 4 , 'Offer1' , 'John Doe' , 1 Union all
SELECT 5 , 'Offer2' , 'Jane Doe' , 2
)
,TmpLabels(DeliveryVersionId,Label)
AS
(
SELECT 1 , 'Service, Time, Material ' Union all
SELECT 2 , 'Consulting, Time'
)
Select B.OfferId,B.Tile,B.Manager, T.Label AS Delivery
From BasicOffers B
INNER JOIN TmpLabels T
ON T.DeliveryVersionId=B.DeliveryVersionId
--To COnvert into Comma separated
;WITH Cte_Convert(OfferId,Title,Manager,Delivery )
AS
(
SELECT 4 , 'Offer1' , 'John Doe' , 'Service' Union All
SELECT 4 , 'Offer1' , 'John Doe' , 'Time' Union All
SELECT 4 , 'Offer1' , 'John Doe' , 'Material' Union All
SELECT 5 , 'Offer2' , 'Jane Doe' , 'Consulting' Union All
SELECT 5 , 'Offer2' , 'Jane Doe' , 'Time'
)
Select DISTINCT OfferId,Title,Manager,STUFF((SELECT DISTINCT ',' + CAST(i.Delivery AS VARCHAR(20)) FROM Cte_Convert i
WHERE i.OfferId=o.OfferId
FOR XML PATH ('')),1,1,'')AS Delivery
FROM Cte_Convert o
I Assume either above or below code might be useful
--Split Delivery column as comma separted in below Cte
;WITH Cte_Convert(OfferId,Title,Manager,Delivery )
AS
(
SELECT 4 , 'Offer1' , 'John Doe' , 'Service' Union All
SELECT 4 , 'Offer1' , 'John Doe' , 'Time' Union All
SELECT 4 , 'Offer1' , 'John Doe' , 'Material' Union All
SELECT 5 , 'Offer2' , 'Jane Doe' , 'Consulting' Union All
SELECT 5 , 'Offer2' , 'Jane Doe' , 'Time'
)
,Final
AS
(
SELECT ROW_NUMBER()OVER(Order by (SELECT ''))AS DeliveryVersionId ,* FROM
(
SELECT DISTINCT OfferId,Title,Manager,STUFF((SELECT DISTINCT ',' + CAST(i.Delivery AS VARCHAR(20)) FROM Cte_Convert i
WHERE i.OfferId=o.OfferId
FOR XML PATH ('')),1,1,'')AS Label
FROM Cte_Convert o
)dt
)
,BasicOffers(OfferId,Tile,Manager,DeliveryVersionId )
AS
(
SELECT 4 , 'Offer1' , 'John Doe' , 1 Union all
SELECT 5 , 'Offer2' , 'Jane Doe' , 2
)
,TmpLabels(DeliveryVersionId,Label)
AS
(
SELECT 1 , 'Service, Time, Material ' Union all
SELECT 2 , 'Consulting, Time'
)
Select B.OfferId,B.Tile,B.Manager, T.Label AS Delivery
From BasicOffers B
INNER JOIN Final T
ON T.DeliveryVersionId=B.DeliveryVersionId
Я использовал временные таблицы и левое внешнее соединение между ними, чтобы решить эту проблему. Обратите внимание, что я предположил, что DeliveryVersionId является основным ключом в #TmpLabels.
Пожалуйста, дайте мне знать, если это поможет вам.
DECLARE @BasicOffers Table (
OfferId int,
Tile varchar(100),
Manager varchar(100),
DeliveryVersionId int)
insert into @BasicOffers values (4,'Offer1','John Doe',1)
insert into @BasicOffers values (5,'Offer2','Jane Doe',2)
DECLARE @TmpLabels Table (
DeliveryVersionId int,
Label varchar(100)
)
insert into @TmpLabels values (1,'Service, Time, Material')
insert into @TmpLabels values (2,'Consulting, Time')
Select OfferId, Tile, Manager, Label as Delivery
From @BasicOffers A Left Outer join
@TmpLabels B on A.DeliveryVersionId=B.DeliveryVersionId
Новые вопросы
sql
Язык структурированных запросов (SQL) - это язык запросов к базам данных. Вопросы должны включать примеры кода, структуру таблицы, примеры данных и тег для используемой реализации СУБД (например, MySQL, PostgreSQL, Oracle, MS SQL Server, IBM DB2 и т. Д.). Если ваш вопрос относится исключительно к конкретной СУБД (использует определенные расширения / функции), используйте вместо этого тег этой СУБД. Ответы на вопросы, помеченные SQL, должны использовать стандарт ISO / IEC SQL.