我想做的事情: 我在SQL表中有记录,其中有5列和数千行。 这些行共享重复数据(即帐号),但是每个行的独特之处在于其中一列中的数据不同。
举个例子:
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)
如果我不得不猜测,你在子查询中有一个不必要的自我加入:
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
。
答案 1 :(得分:0)
使用UNION去除所有重复值并在输出上使用FOR XML PATH将其附加到单个字符串:
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
未经测试,将其视为伪代码以提供一般概念。