2015-01-12 125 views
1

我有一個測試表像這個 -壓縮數據

Field 
A 
B 
C 
END 
D 
E 
F 
END 
G 
H 
I 
END 

我要壓縮關鍵字「END」這個數據在此格式 -

Field 
A|B|C 
D|E|F 
G|H|I 

嘗試使用Monarch Pro,但無法獲得理想的結果。我真的無法想到在SQL中開始這種方式。請幫忙。

+0

「Field」是表中唯一的列嗎? –

+0

是的。而問題是兩個連續的「結束」之間的行數可能會有所不同。只有槓桿我有這個關鍵詞。 – user1463242

+2

然後,我不知道任何可能的方法,因爲您無法可靠地按字段排序,並且知道關鍵詞在哪些行之間發生。也許你可以在你的前端應用程序中處理這個問題? –

回答

1

這可能有幫助。

DECLARE @WORD VARCHAR(300) 
SELECT @WORD = COALESCE(@WORD + '|','') + Field FROM [YourTable] 
SELECT @WORD = REPLACE(@WORD, 'END', '$') 

SELECT @WORD Field INTO #A 

;WITH c(FieldOutput, Field) as (
select CAST(LEFT(Field, CHARINDEX('$',Field+'$')-2) AS VARCHAR(100)), 
    STUFF(Field, 1, CHARINDEX('$',Field+'$')+1, '') 
from #A 
where ISNULL(Field, '') <> '' 
union all 
select CAST(LEFT(Field, CHARINDEX('$',Field+'$')-2) AS VARCHAR(100)), 
    STUFF(Field, 1, CHARINDEX('$',Field+'$')+1, '') 
from c 
where ISNULL(Field, '') <> '' 
) 

select FieldOutput AS Field 
from c 

編輯

創建一個fiddle測試了這一點。

+0

我其實有超過100萬行。代碼已經運行了10多個小時。會讓你知道結果。 – user1463242

+0

你可以先在小桌子上試試看看它是否適合你?嘗試一個'SELECT TOP 1000 * INTO ...'構造來填充臨時表並檢查它。 – SouravA

+1

已經做到了。它工作正常。但是等待完整數據集的結果採用Varchar(max)。 – user1463242

0

高級別方法:

使用遊標逐行掃描表格。

附加到一個臨時變量,直到該行讀取'END',然後將temp變量的內容寫入到另一個表上的行。

迭代直到你到達表的末尾。

有可能是一個更優雅,非遊標的方式來做到這一點,但這將完成工作。

+2

如果不能使用ORDER BY,則不能保證您按照您打算的順序逐步瀏覽表格。 –