【问题标题】:SQL - Combine Multiple Columns with Multiple Rows into one rowSQL - 将多列与多行合并为一行
【发布时间】:2015-04-07 13:20:41
【问题描述】:

我正在尝试做的事情: 我在一个有 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]

但我得到一个长长的字符串,其中包含一列中的重复行。我不确定还有什么可以尝试的,所以任何见解都将不胜感激。

【问题讨论】:

  • 你想要的输出是什么?
  • 想要的输出是:123|abc|456|def|789|date

标签: sql sql-server


【解决方案1】:

如果我不得不猜测,您在子查询中有一个不必要的自联接:

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

【讨论】:

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

使用 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

未经测试,视为伪代码给出大致思路。

【讨论】:

    猜你喜欢
    • 2020-06-09
    • 1970-01-01
    • 2012-05-27
    • 2016-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-21
    • 1970-01-01
    相关资源
    最近更新 更多