将相同记录的行连接到一行

时间:2013-01-17 16:40:25

标签: sql sql-server-2008 concatenation

您好我需要在同一行中包含员工的所有分配。一些员工有1个任务,有些有3个或更多。这是为了进入一个sproc并带回该记录下的所有作业。

数据库中有3条记录的记录示例:
约翰doe - assign1
约翰·多伊 - assign2
John doe - assign3

期望的结果:
3,assign1,assign2,assign3

数据库w / 1记录中的记录示例:
John doe - assign1

期望的结果:
1,assign1

这是我到目前为止所做的,但无法让它发挥作用。

    SELECT cast(count(*) as varchar(10))+', ' + min([Assign1])+', '+
max([Assign1]), max([Assign1])
From assignment
where year = '2012'
and first_name = 'firstname'
and last_name = 'lastname'

这是愚蠢的表格结构:

Create INTO [database].[dbo].[assignment]
           ([employee_key]
           ,[last_name]
           ,[first_name]
           ,[assignment_code]
           ,[assignment_desc] )

1 个答案:

答案 0 :(得分:1)

我会研究使用STUFF命令。如果你有一个ID列(需要你的表模式),可以优化这个,但是给出了上面的代码,如下所示:

Select cast(count(*) as varchar) + ', ' +
   stuff((select  ', '+A2.Assign1
         from Assignment A2
         where year = '2012'
             and first_name = 'john'
             and last_name = 'doe'
         for xml path(''), type).value('.', 'nvarchar(max)'), 1, 2, '')
FROM Assignment A1
WHERE year = '2012'
   and first_name = 'john'
   and last_name = 'doe'

SQL Fiddle

这里没有对WHERE子句进行两次硬编码:

Select count(*), 
   stuff((select  ', '+A2.Assign1
         from Assignment A2
         where A2.Year = A1.Year and 
            A2.First_Name = A1.First_Name and 
            A2.Last_Name = A1.Last_Name
         for xml path(''), type).value('.', 'nvarchar(max)'), 1, 2, '')
FROM Assignment A1
WHERE year = '2012'
    and first_name = 'john'
    and last_name = 'doe'
GROUP BY year, first_name, last_name
祝你好运。