Sql 如何将每个ID的多行合并到特定列的一行中?

Sql 如何将每个ID的多行合并到特定列的一行中?,sql,function,tsql,concatenation,Sql,Function,Tsql,Concatenation,上面是Select语句返回的内容 我希望select语句为每个ID返回一行,并结合最后一列“Inputs” 我目前使用的是一个非常基本的select语句,但是这个select语句返回的行数超过5000行,而它返回的行数应该不到这个数字的一半。您可以编写类似这样的语句 ID NAME INPUTS 2 ABCD First Name 2 ABCD La

上面是Select语句返回的内容

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


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

您可以编写类似这样的语句

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
     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
这将处理大多数情况:

  • 没有名字
  • 姓氏
  • 没有名字

即使在特殊情况下可以做一些改进

您也可以编写如下内容

     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
这将处理大多数情况:

  • 没有名字
  • 姓氏
  • 没有名字

即使在特殊情况下可以做一些改进

您如何保证firstname优先于lastname?需要采取一些措施来执行这一命令。输入总是有两个值吗?如何保证firstname优先于lastname?需要采取一些措施来执行这一命令。输入总是有两个值吗?如何保证firstname优先于lastname?需要采取一些措施来执行这一命令。输入总是有2个值吗?Sébastien Sevrin-如果ID的“输入”值的数量不同怎么办?ID:2有2个输入值,ID:6有5个输入值。在这种情况下,您的查询将失败。@kiki47-我不明白您的意思,但无论如何,OP中甚至没有具体说明。我在帖子中说“对于特殊情况,可以做一些改进”,我认为最好保持查询尽可能简单,只有在必要时才进行更改。我认为代码应该是可靠的,并且应该能够接受不同的条件。sébastien Sevrin-查询不可靠,如果输入值更改,它将失败!!再见,巴斯蒂安·塞夫林-如果ID的“输入”值的数量不同怎么办?ID:2有2个输入值,ID:6有5个输入值。在这种情况下,您的查询将失败。@kiki47-我不明白您的意思,但无论如何,OP中甚至没有具体说明。我在帖子中说“对于特殊情况,可以做一些改进”,我认为最好保持查询尽可能简单,只有在必要时才进行更改。我认为代码应该是可靠的,并且应该能够接受不同的条件。sébastien Sevrin-查询不可靠,如果输入值更改,它将失败!!再见,巴斯蒂安·塞夫林-如果ID的“输入”值的数量不同怎么办?ID:2有2个输入值,ID:6有5个输入值。在这种情况下,您的查询将失败。@kiki47-我不明白您的意思,但无论如何,OP中甚至没有具体说明。我在帖子中说“对于特殊情况,可以做一些改进”,我认为最好保持查询尽可能简单,只有在必要时才进行更改。我认为代码应该是可靠的,并且应该能够接受不同的条件。sébastien Sevrin-查询不可靠,如果输入值更改,它将失败!!再见