PIVOT 的缺点是必须知道列,因为您必须在查询中提供 id。您可以通过使用动态 SQL 来解决此问题,即在您的情况下,根据 Roles 表中的单独查询结果动态生成 PIVOT 查询,然后执行结果。这可以在存储过程中轻松完成。
例子:
CREATE TABLE #CustomerRole ([CustId] int, [RoleId] int);
INSERT INTO #CustomerRole values (2, 4);
INSERT INTO #CustomerRole values (2, 3);
INSERT INTO #CustomerRole values (3, 4);
INSERT INTO #CustomerRole values (4, 1);
INSERT INTO #CustomerRole values (4, 2);
CREATE TABLE #Role ([Id] int, [Role] varchar(20));
INSERT INTO #Role values (1, 'Admin');
INSERT INTO #Role values (2, 'Manager');
INSERT INTO #Role values (3, 'Support');
INSERT INTO #Role values (4, 'Assistant');
DECLARE @RoleList nvarchar(MAX)
SELECT @RoleList = COALESCE(@RoleList + ',[' + [Role] + ']',
'[' + [Role] + ']')
FROM #Role;
DECLARE @SQL Nvarchar(max);
SET @SQL = 'SELECT
[CustId] ' +
ISNULL(', ' + @RoleList , '') + '
FROM #CustomerRole custrole
inner join #Role as r
on r.[Id] = custrole.[RoleId]
PIVOT (count([Id]) for [Role] IN
(' + ISNULL(@RoleList, '[No role]') +
')) as pvt;'
EXEC sp_executesql @SQL;
drop table #Role;
drop table #CustomerRole;