2012-09-18 32 views
0

我有好以下詳細結合相關行的列到分隔的列表

ID  |NO|Rnk|SP1|Sp2 
0000177|01| 1| N|N 
0000178|01| 1| P|P 
0000178|01| 2| GP|GP 
0000179|01| 1|ORS|ORS 
0000180|01| 1| GP|GP 
0000181|01| 1| GP|GP 
0000181|01| 2| GS|GS 
0000182|01| 1| GP|GP 
0000183|01| 1| FM|FM 
0000183|01| 2| CM|CM 
0000183|01| 3| RM|RM 

文本文件,我必須創建出這樣

ID  |NO|Rnk|SPC 
0000177|01| 1|N 
0000178|01| 1|P GP 
0000179|01| 1|ORS 
0000180|01| 1|GP 
0000181|01| 1|GP GS 
0000182|01| 1|GP 
0000183|01| 1|FM CM RM 

歡迎您的建議是...有可能使用樞軸轉換? 請解釋你的answares?

+0

您似乎希望將SP1和SP2字段的唯一值組合到空格分隔的輸出列中。您能否詳細說明您的業務規則以合併行?看來你是在ID和NO上分組的。 Rnk是如何影響的? – billinkc

+0

我必須將Spc值與最高rnk的ID進行組合,並且對於ID和Rnk,最多有3個不同的Spec。 – 343

+0

我做了一個包含腳本任務的包,但是可以通過數據透視轉換來完成嗎? – 343

回答

0

如果將文本文件導入到表中,則可以在SQL中重新組織所有數據。該SQL將類似如下:

SELECT 
    TFT.ID, 
    MIN(TFT.NO) AS NO, 
    MIN(TFT.Rnk) AS Rnk, 
    TFT0.SPC 
FROM 
    TextFileTable TFT 
INNER JOIN (
    SELECT DISTINCT 
    TFT_D.ID, 
    STUFF((SELECT ' ' + Sp2 FROM TextFileTable TFT_X WHERE TFT_D.ID = TFT_X.ID FOR XML PATH('')), 1, 1, '') AS SPC 
    FROM 
    TextFileTable TFT_D 
) TFT0 
ON 
    TFT.ID= TFT0.ID 
GROUP BY 
    TFT.ID, 
    TFT0.SPC 
ORDER BY 
    TFT.ID 

的假設是SP1和SP2總是相同的,你總是希望最小NO,你總是希望最低排名。從最裏面的邏輯開始,您使用FOR XML PATH('')技巧(示例說明:http://fergusondigital.com/Blog/post.cfm/using-for-xml-path-and-stuff-to-coalesce)連接了Sp2值的空格分隔列表。將每個列表與其ID相關聯,使用DISTINCT行爲每個列表取一行。然後按ID和SPC對這些行進行分組,並按ID加入以獲得NO和Rnk值。