将相关行的列组合成分隔列表

时间:2012-09-18 17:01:37

标签: sql sql-server sql-server-2008 ssis

我有文本文件,其中包含以下详细信息

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

我必须像这样创建Out

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

欢迎您的建议......是否可以使用Pivot Transformation? 请解释你的answares?

1 个答案:

答案 0 :(得分: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('')技巧连接一个以空格分隔的Sp2值列表(示例说明:http://fergusondigital.com/Blog/post.cfm/using-for-xml-path-and-stuff-to-coalesce)。将每个列表与其ID相关联,获取DISTINCT行以获得每个列表一行。然后按ID和SPC对这些行进行分组,按ID连接以获取NO和Rnk值。