两个表的枢轴以显示用户类型和分配角色的矩阵

时间:2018-10-29 11:17:36

标签: sql sql-server tsql

我有两个表: - 用户类型 -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

有什么提示吗?

1 个答案:

答案 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;

enter image description here