Результаты сопоставления SQL SSRS с матрицей

#sql #sql-server #reporting-services #sql-server-2012 #ssrs-2012

#sql #sql-server #службы отчетов #sql-server-2012 #ssrs-2012

Вопрос:

У меня есть несколько профилей, которые имеют определенный уровень разрешений, которые перечисляются и хранятся в SQL. Я хочу создать в SSRS отчет, в котором отображаются все разрешения в левой части таблицы и все профили сверху с X или каким-либо указанием профилей, имеющих соответствующие разрешения. Эта информация хранится в трех таблицах.

Таблица 1: Профили — дает имена профилей, связанных с идентификатором GUID

Таблица 2: Profile_Priv — предоставляет идентификатор GUID профиля с номером разрешения (в этой таблице отображаются только разрешения, фактически предоставленные профилю)

Таблица 3: Привилегии — связывает номер разрешения обратно с именем разрешения.

У меня есть запрос, который будет извлекать разрешения, назначенные профилю, и я могу легко заполнить пустую матрицу всеми возможными разрешениями, но объединение этих двух ускользает от меня. Это то, что у меня есть в SSRS до сих пор. Я передаю параметр в SSRS с именем ProfileName, чтобы позволить запросу показывать, какие профили необходимы для этого конкретного отчета.

 Select Privileges.Description, Profiles.Name
FROM Privileges LEFT OUTER JOIN
Profile_Priv ON Privileges.ID = Profile_Priv.ID INNER JOIN
Profiles ON Profile_Priv.PID = Profiles.PID
WHERE (Profiles.Name = @ProfileName)
ORDER BY Privileges.ID
  

Это не заполняет какую-либо информацию в таблице, как я ожидал, а также не будет выполнять какие-либо преобразования данных, такие как преобразование значения в Yes.

Любая обратная связь или помощь приветствуются.

Дополнение 1:

Даже при изменении его на полное объединение выполнение отдельного профиля возвращает только те разрешения, которые есть у конкретного профиля.

Я хочу создать что-то вроде этого в отчете:

                Profile 1     Profile 2     Profile 3    Profile 4
Permission 1   X                           X                     
Permission 2   X             X             X            X
Permission 3                 X                          X
Permission 4                                        
  

В настоящее время я получаю это, используя приведенный выше пример, если я искал профиль 2:

                Profile 2                              
Permission 2   X             
Permission 3   X               
  

Комментарии:

1. Вам нужно добавить примеры данных, которые вы получаете в данный момент, и то, как вы хотите, чтобы они выглядели в отчете.

2. Добавлена дополнительная информация для целей пояснения.

3. Вы фильтруете для профиля 2 , поэтому ожидаются только разрешения 2 и 3 . Вы должны удалить свое предложение WHERE, если хотите, чтобы они все были в матрице, иначе ваш фильтр разрешит только выбранный профиль в таблице.

Ответ №1:

Вы можете выполнить полное внешнее соединение, но вместо использования предложения WHERE используйте оператор CASE, чтобы возвращать что-то вроде «True» (если у профиля есть это разрешение) или «False», если это не так. Таким образом, вы всегда получаете все разрешения.

Комментарии:

1. Оператор case отлично решил проблему. Спасибо.