2013-02-12 3 views
3

Есть ли способ создать таблицу/матрицу данных, в которой группы столбцов & управляются из отдельного запроса/набора данных, отличного от данных основного отчета?Строки и столбцы матрицы SSRS, управляемые запросами

Возьмем, к примеру, конструкт «Персона» с колоннами: - имя - пол - marital_status

Я хочу, чтобы столбцы матрицы всегда содержат все «полов», а строки в всегда содержат все «семейные статусы» независимо от критериев запроса, а пересечение строк/столбцов - совокупное количество записей.

, например, запрос может быть select * from person where name = 'aaron'

Все записи возвращаются «мужчина», но я все еще хочу, чтобы включить колонку для «женского» (где все графы в колонке «женский» будет 0)

Я хотел бы ожидать выход выглядеть следующим образом:

Marital Status: ~ Male ~ Female 
Single ~ 5 ~ 0 
Married ~ 8 ~ 0 
Defacto ~ 2 ~ 0 
... 

Я не хочу, чтобы сделать фиктивный запрос, например:

select 'male' as gender, null as name, null as marital_status 
union all 
select 'female' as gender, null as name, null as marital_status 
union all 
select * from person where [ ... criteria] 

Было бы хорошо иметь 3 наборов данных вождения матрицы, если это возможно ...

  • "ROWDATA", содержащий select distinct marital_status from person
  • "ColumnData", содержащий select distinct gender from person и
  • "MainData", содержащий ` выберите * с человека, где [... критерии]

Есть ли способ получить элемент управления Matrix для использования отдельных запросов для групп Row/Column?

+0

Уместно ли иметь 3 набора данных, т. Е. Ваши данные существуют на 3 отдельных серверах или в базах данных, или вы можете объединить все в один аккуратный SQL? – glh

+1

Похоже, с небольшим количеством творчества в выражении я могу свернуть его в один запрос, который имеет перекрестное соединение против всех возможных значений. – AndrewP

ответ

3

Почему так сложно? Думайте проще ... Создать запрос в SQL, как это:

WITH 
Gender AS 
(
    SELECT 1 AS GenderID, 'Male' AS GenderName 
    UNION ALL 
    SELECT 2 AS GenderID, 'Female' AS GenderName 
), 
MartialStatus AS 
(
    SELECT 1 AS MartialStatusID, 'Single' AS MStatus 
    UNION 
    SELECT 2 AS MartialStatusID, 'Married' AS MStatus 
), 
Persons AS 
(
    SELECT 1 AS PersonID, 'John' AS Name, 1 AS GenderID, 2 AS MartialStatusID 
    UNION ALL 
    SELECT 2 AS PersonID, 'Linda' AS Name, 2 AS GenderID, 1 AS MartialStatusID 
    UNION ALL 
    SELECT 3 AS PersonID, 'Mike' AS Name, 1 AS GenderID, 1 AS MartialStatusID 
    UNION ALL 
    SELECT 4 AS PersonID, 'Jenna' AS Name, 2 AS GenderID, 1 AS MartialStatusID 
) 
SELECT Gender.GenderName, MartialStatus.MStatus, Persons.PersonID, Persons.Name 
FROM Gender 
CROSS JOIN MartialStatus 
LEFT JOIN Persons ON Persons.GenderID = Gender.GenderID AND 
        Persons.MartialStatusID = MartialStatus.MartialStatusID 

, которые производят результат:

Male Single 3  Mike 
Female Single 2  Linda 
Female Single 4  Jenna 
Male Married 1  John 
Female Married NULL NULL 

Затем в ЗАЯВОК в вашей карте столбцов матрицы и строки: enter image description here

Выражение здесь =IIF(Sum(Fields!PersonID.Value) IS Nothing, 0, Sum(Fields!PersonID.Value)) для печати 0 если у нас нет лиц. И вы получите результат, который вы хотите:

enter image description here

Пришло будет проще и лучше для производительности.

+0

Привет, я не думал использовать перекрестное соединение для выбора возможных значений матрицы. Я думаю, что на <> он должен быть счетчиком не суммой и что счетчик не должен включать в себя значения null или, возможно, использовать a = SUM (iif (поля! PersonID.Значение ничего, 0, 1), но это должно привести меня к правильному пути, спасибо! – AndrewP

Смежные вопросы