簡體   English   中英

#Temporary表中的T-SQL CONCATE ROW值

[英]T-SQL CONCATE ROW values from #Temporary Table

我目前正在SQL Server 2012上的T-SQL中進行SQL查詢,目的是將多個表串聯或合並為1個表並串聯多個行。 到目前為止,一切正常。 我使用STUFF和FOR XML PATH將幾行連接為1。

不幸的是,當我要將2個臨時表合並到1個最終結果表中時,合並(合並)的行再次消失。

我的表如下所示:

表格#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

我真的不知道,這是否是將所有內容存儲到臨時表然后合並或立即選擇所有內容的最佳解決方案。

無論如何,不​​幸的是我的查詢似乎無法正常工作。

您是否有解決此問題的想法?

非常感謝!

;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

我使用臨時表和它們之間的Left外部聯接來解決它。 請注意,我認為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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM