【问题标题】:Query that combines several columns into one row based on a join by Id [duplicate]根据 Id 的连接将多列组合成一行的查询 [重复]
【发布时间】:2018-11-27 16:24:35
【问题描述】:

给定下表T:

------------------------------
|  Person | PermissionTypeId |
------------------------------
|  Jon   |       1           |
------------------------------
|  Jon   |       2           |
------------------------------
|  Adam  |       1           |
------------------------------

还有表P:

------------------------------
| Id   | PermDescription     |
------------------------------
|  1   |  Can Access Reports |             
------------------------------
|  2   |  Can Access Locker  |         
------------------------------

假设我想编写一个返回一行 Jons 权限的查询,如下所示:

------------------------------------------------------
| Person   | Can Access Reports | Can Access Locker  |
------------------------------------------------------
|  Jon     |      true          |      true          |
------------------------------------------------------

如果存在与用户关联的 PermissionTypeId,则存在 true。 false 存在于不存在的地方。因此 Adams 查询将返回:

-----------------------------------------------------
| Person   | Can Access Reports | Can Access Locker |
----------------------------------------------------
|  Adam    |      true          |        false      |
-----------------------------------------------------

如何编写返回该行的以下查询?

【问题讨论】:

  • 如果列数不同,则需要进行动态透视。
  • 如果在没有权限的情况下拥有恒定数量的“false”列更容易,我可以编辑我的答案来要求它,因为它仍然返回我想要的内容跨度>
  • 是的,如果您有一致数量的“true”或“false”列,那么它是一个没有聚合的简单枢轴,而不是动态枢轴。这更容易一些。
  • 好的,我编辑了它以返回一组数字
  • 看看这是否有帮助:stackoverflow.com/questions/28322228/…

标签: sql sql-server tsql join pivot


【解决方案1】:

你可以试试这个:

declare @T table(person varchar(10), PermissionType int);
insert into @T values
('Jon', 1),
('Jon', 2),
('Adam', 1);
declare @P table(id int, PermDescription varchar(100));
insert into @P values
(1, 'Can Access Reports'),
(2, 'Can Access Locker');

select person,
       case when [Can Access Reports] is null then 'false' else 'true' end [Can Access Reports],
       case when [Can Access Locker] is null then 'false' else 'true' end [Can Access Locker]
from (
    select t.person, t.permissiontype, p.permdescription
    from @T t join @p p on t.PermissionType = p.id
) unpvt pivot (
    max(permissiontype) for permdescription in ([Can Access Reports],[Can Access Locker])
) pvt

【讨论】:

    【解决方案2】:

    你可以像下面这样旋转 See working demo

     select *
        from
         (
          select 
              t.Person,
              p1.PermDescription,
              data = case when max(p2.id) is null then N'false' else N'true' end
          from 
              t cross join  P p1 
               left join P p2
               on p2.id=t.PermissionTypeId and p2.id=p1.id
           group by t.Person,
              p1.PermDescription
           )   src
           pivot 
           ( max(data) for PermDescription in ([Can Access Locker],[Can Access Reports]))p
    

    【讨论】:

      猜你喜欢
      • 2022-01-09
      • 2023-03-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-24
      • 1970-01-01
      • 2022-01-08
      • 2013-03-28
      相关资源
      最近更新 更多