我有两个表: - 用户类型 -UserTypeRole
UserType:
| UserTypeCode | DisplayTitle | Description |
|-------------------|---------------------|---------------------|
| AdministratorUser | Administrator User | Administrator User |
| GeneralUser | General User | General User |
| READONLY | RO User | RO User |
| TeamManager | Team Manager | Teamd Manager |
UserTypeRole:
| UserTypeCode | ApplicationRoleCode |
|-------------------|------------------------|
| AdministratorUser | CaseDocument |
| AdministratorUser | CaseNote |
| AdministratorUser | CaseNoteAdd |
| AdministratorUser | Dashboard |
| GeneralUser | CaseDocument |
| GeneralUser | CaseNote |
| GeneralUser | CaseNoteAdd |
| GeneralUser | CaseOverview |
| GeneralUser | CaseSearch |
| GeneralUser | Dashboard |
| READONLY | CaseDocument |
| READONLY | CaseNote |
| READONLY | CaseOverview |
| READONLY | CaseSearch |
| READONLY | Dashboard |
| TeamManager | CaseDocument |
| TeamManager | CaseDocumentEdit |
| TeamManager | CaseNote |
| TeamManager | CaseNoteAdd |
| TeamManager | CaseNoteDelete |
| TeamManager | CaseNoteEdit |
| TeamManager | CaseOverview |
| TeamManager | CaseSearch |
| TeamManager | CaseStateEdit |
我还有一个ApplicationRole表,其中包含所有ApplicationRoles的列表以及每一个的描述。
并非所有用户都具有所有类型,我正在尝试生成具有“是”和“否”值的矩阵,如下所示:
| ApplicationRoleCode | AdministratorUser | GeneralUser | READONLY | TeamManager |
|---------------------|-------------------|-------------|----------|-------------|
| Dashboard | Yes | Yes | Yes | Yes |
| CaseDocument | Yes | Yes | Yes | Yes |
| CashNoteAdd | Yes | Yes | No | Yes |
.... etc
我了解基本要求是从UserTypeRole到UserType的外部联接,并且NULL值变为'No'值,但是我正在努力将数据PIVOT:
SELECT ar.ApplicationRoleCode, utr.UserTypeCode, ut.DisplayTitle, ar.Description
FROM ApplicationRole ar
LEFT OUTER JOIN UserTypeRole utr ON utr.ApplicationRoleCode = ar.ApplicationRoleCode
INNER JOIN UserType ut ON ut.UserTypeCode = utr.UserTypeCode
有什么提示吗?
答案 0 :(得分:1)
尝试一下:
CREATE TABLE #DataSource
(
[UserTypeCode] VARCHAR(64)
,[ApplicationRoleCode] VARCHAR(64)
);
INSERT INTO #DataSource ([UserTypeCode], [ApplicationRoleCode])
VALUES ('AdministratorUser', 'CaseDocument')
,('AdministratorUser', 'CaseNote')
,('AdministratorUser', 'CaseNoteAdd ')
,('AdministratorUser', 'Dashboard')
,('GeneralUser', 'CaseDocument')
,('GeneralUser', 'CaseNote')
,('GeneralUser', 'CaseNoteAdd')
,('GeneralUser', 'CaseOverview')
,('GeneralUser', 'CaseSearch')
,('GeneralUser', 'Dashboard')
,('READONLY', 'CaseDocument')
,('READONLY', 'CaseNote')
,('READONLY', 'CaseOverview')
,('READONLY', 'CaseSearch')
,('READONLY', 'Dashboard')
,('TeamManager', 'CaseDocument')
,('TeamManager', 'CaseDocumentEdit')
,('TeamManager', 'CaseNote')
,('TeamManager', 'CaseNoteAdd')
,('TeamManager', 'CaseNoteDelete')
,('TeamManager', 'CaseNoteEdit')
,('TeamManager', 'CaseOverview')
,('TeamManager', 'CaseSearch')
,('TeamManager', 'CaseStateEdit');
DECLARE @DynammicTSQLStatement NVARCHAR(MAX)
,@DynamicPIVOTColumns NVARCHAR(MAX)
,@DynamicColumns NVARCHAR(MAX);
SET @DynamicPIVOTColumns = STUFF
(
(
SELECT ',[' + CAST([UserTypeCode] AS VARCHAR(12)) + ']'
FROM #DataSource
GROUP BY [UserTypeCode]
ORDER BY [UserTypeCode]
FOR XML PATH('') ,TYPE
).value('.', 'NVARCHAR(MAX)')
,1
,1
,''
);
SET @DynamicColumns = STUFF
(
(
SELECT ',ISNULL([' + CAST([UserTypeCode] AS VARCHAR(12)) + '], ''No'') AS [' +CAST([UserTypeCode] AS VARCHAR(12)) +']'
FROM #DataSource
GROUP BY [UserTypeCode]
ORDER BY [UserTypeCode]
FOR XML PATH('') ,TYPE
).value('.', 'NVARCHAR(MAX)')
,1
,1
,''
);
SET @DynammicTSQLStatement = N'
SELECT [ApplicationRoleCode]
,' + @DynamicColumns + '
FROM
(
SELECT ''Yes'' AS [ID]
,[UserTypeCode]
,[ApplicationRoleCode]
FROM #DataSource
) DS
PIVOT
(
MAX([ID]) FOR [UserTypeCode] IN (' + @DynamicPIVOTColumns + ')
) PVT';
EXEC sp_executesql @DynammicTSQLStatement;
DROP TABLE #DataSource;