2015-06-19 50 views
1
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语句返回的内容。如何将每个ID的多个行组合到一个特定列的单个行中?

我希望select语句每个ID结合最后一列“输入”返回一行。

我目前正在使用非常基本的select语句,但是当select语句返回的数量少于一半时,它将返回超过5,000行。

+2

您如何保证名字在lastname之前?需要执行该命令。总是有2个输入值? –

回答

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 
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
  • 没有名字

即使可以对特殊情况进行一些改进

+0

SébastienSevrin - 如果“输入”值的数量与ID不同,该怎么办? ID:2有2个输入值,ID:6有5个输入值。对于这种情况你的查询将失败。 – 2015-06-19 18:25:52

+0

@ kiki47 - 我没有看到你的观点,但无论如何,甚至没有在OP中指定。我在我的帖子中说过,“对于特殊情况可以做一些改进”,我认为最好尽可能简化查询,只在必要时更改查询。 –

+0

我认为代码应该可靠,应该能够接受不同的条件。 – 2015-06-19 19:43:26

相关问题