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;