要管理新状态,您可以使用动态 TSQL:
create table #status([ID] int, [Status] varchar(max))
insert into #status values
(1 ,'Open')
,(2 ,'Closed')
,(3 ,'Pending')
create table #task([ID] int, [Name] varchar(max), StatusID int)
insert into #task values
(1, 'Task A', 1)
,(2, 'Task B', 1)
,(3, 'Task A', 2)
,(4, 'Task A', 3)
,(5, 'Task C', 2)
declare @sql nvarchar(max)='select t.name as [Name] '
select @sql = @sql + ', sum(case when s.Status = ''' + [Status] + ''' then 1 else 0 end) as [' + [Status] + ' ] '
from #status
select @sql = @sql + ' from #status s left join'
select @sql = @sql + ' #task t'
select @sql = @sql + ' on t.StatusID = s.id'
select @sql = @sql + ' group by t.name;'
execute(@sql)
您的数据结果:
再添加 2 个状态(Status4 和 Status5):
create table #status([ID] int, [Status] varchar(max))
insert into #status values
(1 ,'Open')
,(2 ,'Closed')
,(3 ,'Pending')
,(4 ,'Status4')
,(5 ,'Status5')
create table #task([ID] int, [Name] varchar(max), StatusID int)
insert into #task values
(1, 'Task A', 1)
,(2, 'Task B', 1)
,(3, 'Task A', 2)
,(4, 'Task A', 3)
,(5, 'Task C', 2)
,(6, 'Task D', 4)
,(7, 'Task D', 5)
declare @sql nvarchar(max)='select t.name as [Name] '
select @sql = @sql + ', sum(case when s.Status = ''' + [Status] + ''' then 1 else 0 end) as [' + [Status] + ' ] '
from #status
select @sql = @sql + ' from #status s left join'
select @sql = @sql + ' #task t'
select @sql = @sql + ' on t.StatusID = s.id'
select @sql = @sql + ' group by t.name;'
execute(@sql)
结果: