2015-04-07 54 views
0

我在做什么: 我有一个SQL表中有5列和数千行的记录。 这些行共享重复的数据(即帐号),但每个行的唯一之处在于其中一列中的数据不同。SQL - 将多行与多行组合成一行

举个例子:

col1|col2|col3|col4|col5 
------------------------ 
123|abc|456|def|789 
123|abc|456|def|date 

但列可以有不同的价值观,不一定总是在第5列

这里是我开始:

SELECT TOP (15) stuff((
      SELECT ', ' + te.[accountid] 
       ,te.[char1] 
       ,te.[date] 
       ,te.[date2] 
       ,te.[char2] 
      FROM D AS te 
      INNER JOIN D AS tue ON tue.[accountid] = te.[accountid] 
      WHERE tue.[accountid] = ue.[accountid] 
      FOR XML path('') 
       ,type 
      ).value('.', 'varchar(max)'), 1, 2, '') AS ifile 
FROM D AS ue 
GROUP BY ue.[accountid] 

但我得到一个包含一列中重复行的怪物长字符串。我不知道还有什么可以尝试,所以任何洞察力将不胜感激。

+0

你想要的输出是什么? –

+0

期望的输出是: 123 | abc | 456 | def | 789 | date – jmc

回答

0

如果我猜的话,你有一个不必要的自联接子查询:

SELECT TOP (15) stuff((
      SELECT ', ' + te.[accountid], te.[char1], te.[date], te.[date2], te.[char2] 
      FROM D te 
      WHERE te.[accountid] = ue.[accountid] 
      FOR XML path(''), type 
      ).value('.', 'varchar(max)'), 1, 2, '') AS ifile 
FROM D ue 
GROUP BY ue.[accountid]; 

您还可能要在子查询SELECT DISTINCT

+0

感谢您的回应。我继续并根据您的建议修改了我的查询,并且它可以工作,但它会根据每个帐户ID有多少个行条目来复制逗号之间的数据。 Per Tab Alleman的问题,我想要的是: 123 | abc | 456 | def | 789 | date – jmc

0

使用UNION摆脱所有的重复值,用你的FOR XML路径上的输出追加到一个字符串:

SELECT TOP (15) stuff((
      SELECT ', ' + CAST(te.[accountid] AS varchar(255)) FROM D 
      UNION 
      SELECT ', ' + CAST(te.[char1] AS varchar(255)) FROM D 
      UNION 
      SELECT ', ' + CAST(te.[date] AS varchar(255)) FROM D 
      UNION 
      SELECT ', ' + CAST(te.[date2] AS varchar(255)) FROM D 
      UNION 
      SELECT ', ' + CAST(te.[char2] AS varchar(255)) FROM D 
      FOR XML path('') 
       ,type 
      ).value('.', 'varchar(max)'), 1, 2, '') AS ifile 

未经检验的,当作伪代码给出的总体思路。