-2

我需要从表“userrole”中提取一些系统用户数据到配置记录中,但这些用户权限保存在单个列中,并由不同的角色标识。

所以我的用户角色数据表是这样的,

UserID  RoleID  Discriminator
int     int NVarChar
3483    1   Pathologist
3483    2   Histotech
3483    3   Configuration
3483    4   WebViewer
3484    1   Pathologist
3484    4   WebViewer
3485    1   Pathologist
3485    4   WebViewer
3487    1   Pathologist
3487    2   Histotech
3487    3   Configuration
3487    4   WebViewer
3488    1   Pathologist
3488    2   Histotech
3488    3   Configuration
3488    4   WebViewer

我的目标结果是

3483    Pathologist Histotech   Configuration   WebViewer
3484    Pathologist                             WebViewer
3484    Pathologist                             WebViewer
3487    Pathologist Histotech   Configuration   WebViewer

等等

但是每次“分组”的尝试仍然是我返回了多行,例如

  select USERID
  ,(select Discriminator where roleid = 1) as Pathologist
  ,(select Discriminator where roleid = 2) as Histologist
  ,(select Discriminator where roleid = 3) as Configuration
  ,(select Discriminator where roleid = 4) as Web
  FROM [Workflow].[UserRole]
  group by  userid, RoleID, discriminator

    USERID  Pathologist Histologist Configuration   Web
    3483    Pathologist NULL    NULL    NULL
    3483    NULL    Histotech   NULL    NULL
    3483    NULL    NULL    Configuration   NULL
    3483    NULL    NULL    NULL    WebViewer
    3484    Pathologist NULL    NULL    NULL
    3484    NULL    NULL    NULL    WebViewer
    3485    Pathologist NULL    NULL    NULL
    3485    NULL    NULL    NULL    WebViewer

尝试在用户 ID 上使用 DISTINCT 或 MIN 函数,如SQL Query Multiple Columns Using Distinct Only on One Column中所建议的那样(我知道的情况并不完全相同),仍然会给我相同的多行结果。

对于下一步要尝试什么,我已经达成了一些建议,因此非常感谢您收到任何建议。

4

1 回答 1

2

您可以使用聚合,如下所示:

  select USERID,
         max(case when roleid = 1 then Discriminator end) as Pathologist
         max(case when roleid = 2 then Discriminator end) as Histologist
         max(case when roleid = 3 then Discriminator end) as Configuration
         max(case when roleid = 4 then Discriminator end) as Web
  FROM [Workflow].[UserRole]
  group by userid;

在聚合查询中,group by键指定要返回的行。键的每个唯一组合都会在结果集中获得一行。您包含了不必要的键,导致不必要的行。

于 2019-11-18T13:32:43.660 回答