0

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

数据库中包含 3 条记录的记录示例:
John doe - assign1
John doe - assign2
John doe - assign3

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

数据库中带有 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] )
4

1 回答 1

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 小提琴

这里没有对 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

祝你好运。

于 2013-01-17T16:55:22.850 回答