SQL - 将具有多行的多列合并为一行

时间:2015-04-07 13:20:42

标签: sql sql-server

我想做的事情: 我在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]

但我得到一个怪物长字符串,其中包含一列中的重复行。我不确定还有什么可以尝试,所以任何见解都会受到赞赏。

2 个答案:

答案 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

未经测试,将其视为伪代码以提供一般概念。