У меня сейчас нет доступа к моему ТД, поэтому я делаю это по памяти:
select Grantee, GranteeKind, RoleName,
max(managerRole), max(AssistantRole), max(ExecutiveRole), max(DeputyRole)
from (
SELECT DISTINCT Grantee, GranteeKind, RoleName, WhenGranted,
CASE
WHEN RoleName='Manager' THEN 'Yes' ELSE 'No'
END as ManagerRole,
CASE
WHEN RoleName='Assistant' THEN 'Yes' ELSE 'No'
END as AssistantRole,
CASE
WHEN RoleName='Executive' THEN 'Yes' ELSE 'No'
END as ExecutiveRole,
CASE
WHEN RoleName='Deputy' THEN 'Yes' ELSE 'No'
END AS DeputyRole
FROM DBC.RolesM
WHERE Grantee='UserName'
AND RoleName IN
('Manager',
'Assistant',
'Executive',
'Deputy')
) as DT
group by 1, 2, 3
order by 1, 2;
надеюсь, синтаксических ошибок не будет.
В основном внутренний запрос создает такой список:
Grantee etc, ManagerRole, AssistantRole, etc
abc, Yes No
abc, No Yes
def, Yes No
def, No No
Затем внешний запрос выбирает совокупность каждого столбца. Мы делаем максимум, поэтому «Да» будет бить «Нет». Вы получите «Нет» только в том случае, если у пользователя нет этой роли.
Примечание. Существует предположение, что Grantee, GrantKind и RoleName одинаковы. Если нет, вы получите несколько записей на одного Получателя. Мне пришлось опустить «когда предоставлено», потому что это, вероятно, будет в разное время.