如何将每个ID的多个行组合成特定列的单行?

时间:2015-06-19 16:15:43

标签: sql function tsql concatenation

ID  NAME                        INPUTS
2   ABCD                        First Name
2   ABCD                        Last Name
3   1234                        First Name
3   1234                        Last Name
6   QWERTY                      First Name
6   QWERTY                      Last Name

以上是Select语句返回的内容。

我希望select语句每个ID返回一行,组合最后一列“Inputs”。

我目前正在使用一个非常基本的select语句,但是这个select语句返回超过5,000行时应返回不到该数字的一半。

2 个答案:

答案 0 :(得分:0)

     declare @YourTable table (RowID int, ID int, name varchar(100), inputs varchar(500))
insert into @YourTable VALUES (1,2,'ABCD', 'First Name')
insert into @YourTable VALUES (2,2,'ABCD', 'Last Name')
insert into @YourTable VALUES (3,3,'1234', 'First Name')
insert into @YourTable VALUES (4,3,'1234','Last Name')
--insert into @YourTable VALUES (5,3,'A & Z')
set nocount off
SELECT
    t1.id, t1.name
        ,STUFF(
                   (SELECT
                        ', ' + t2.inputs
                        FROM @YourTable t2
                        WHERE t1.id=t2.id
                        ORDER BY t2.inputs
                        FOR XML PATH(''), TYPE
                   ).value('.','varchar(max)')
                   ,1,2, ''
              ) AS inputs
    FROM @YourTable t1
    GROUP BY  t1.id, t1.name

答案 1 :(得分:0)

你可以写点像

select p.[ID], p.[First Name], p.[Last Name], isnull(p.[First Name], '') + ' ' + isnull(p.[Last Name], '') [FullName]
from
(
    select t.[ID], t.[NAME], t.[INPUTS]
    from [dbo].[YourTable] t
) x
pivot
(
    max(x.[NAME]) for x.[INPUTS] in ([First Name], [Last Name])
) p

这将处理大多数情况:

  • First Name
  • Last Name
  • 根本没有名字

尽管可以针对特殊情况进行一些改进