SSRS 2008 и группировка столбцов / строк - PullRequest
2 голосов
/ 02 марта 2011

Матрица ... табликс .... список / матрица ... список / табликс ... Понятия не имею.никто из них не делает то, что я хочу.

Итак, у меня есть данные резидента ... имя, пол, уровень ухода, информация о номере / местоположении.И у меня есть номера телефонов врачей.Все это должно выглядеть как форма, которую я имею, но должно быть сделано в SSRS.

Форма выглядит следующим образом:
(Тип телефона и номер телефона можно разделить, но не обязательно, если это имеет смысл.)

 _______________________________________________________________________________
| Allergies:  NKA                                                               |
|                                                                               |
|_______________________________________________________________________________|
|Resident   |    ID     |      Gender    |    Room    |  Type          Number   |
|___________|___________|________________|____________|_________________________|
|           |           |                |            |  Home          555-3242 |
|Kim        |   123     |     female     |      420   |  Cell          555-1111 |
|___________|___________|________________|____________|__Other_________234-5554_|

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

То, что я пытался сделать, это использовать группирование в матрице, чтобы воссоздать весь эффект формы с телефонными номерами в качестве «деталей» и получить группу столбцов по тексту «Аллергии», а затем строкугруппировать по информации о человеке.Но .... Мне кажется, я не могу сделать это правильно, и все выглядит великолепно, за исключением того, что по какой-то причине в списке будет указан только один номер телефона, и мне нужен один или несколько, чтобы появиться.

Я настроил свои данные так:

(name)  (ID)   (gender)   (roomNumber)   (allergies)   (phoneType)  (phoneNumber) 
Kim     123    female     410            NKA           home         555-3332
Kim     123    female     410            NKA           cell         555-2342  
Kim     123    female     410            NKA           other        555-1111           

Ох ... что я делаю не так?Если я использую список (для вышеприведенного текста об аллергии) с таблицей внутри, сгруппированной по personInfo / personID / stuff с телефонными номерами в качестве деталей, я не могу выстроить информацию о человеке, чтобы цифры непросто висит внизу.

Очевидно, я упростил данные, но это общая идея ... Пожалуйста, дайте мне несколько советов.Для жизни я не могу понять группировку.Нужно ли мои данные изложены по-другому?

Большое вам спасибо ............ за ваше время, Ким

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

Итак, допустим, у меня есть базовая таблица, которая называется person, которая хранит всю мою личную информацию.Тогда у меня есть таблица с названием номера телефона, и в ней есть мои номера.Человек и телефон связаны идентификатором.Затем у меня есть таблица аллергий, связанная с personID, в ней есть идентификатор аллергии и текст аллергии.Левый внешний присоединиться к ним.Та да!Это действительно большая база данных, и я должен проверить кучу вещей, и на самом деле не представляется возможным предоставить запрос прямо сейчас.Извините ... все это является результатом реального упрощения ситуации, но это дает представление, и я все еще не могу выполнить желаемую группировку, даже если данные были такими простыми (что я и прошу помочь).

Еще раз спасибо!


Мне действительно очень нужна помощь с этим, я даже не смог получить ее сегодня утром ... Итак, давайте забудем часть аллергии выше, чтобы сделать этодействительно легко.Я до сих пор не могу заставить группу работать над Персоном, а затем использовать номера телефонов в качестве деталей.Вот некоторые примеры данных и прочее .... Так как этот отчет фактически будет служить формой, я хочу, чтобы пользователь выбрал нужного ему человека с параметрами, чтобы personID был передан в мой запрос / сохраненный процесс, и я получу толькоодин человек назад, но в качестве примера я включил трех человек в свой личный стол.

Это не фактическая структура, или данные, или запрос ... просто я когда-то за 10 минут сделал это, чтобы продемонстрировать проблему с группировкой в ​​SSRS ... так что, пожалуйста, не комментируйте структуру БД или что-то в этом родеЯ просто подумал, что получу лучший ответ, если предоставлю некоторые данные для игры в SSRS.Если я / кто-то сможет заставить его работать с этими данными, он будет работать с моими реальными данными.

create table #person
(
    personID int identity(1,1), 
    name varchar(20),
    birthdate datetime, 
    gender char(1), 
    roomnumber int

    primary key (personID) 
)

create table #phoneNumbers
(
    phoneID int identity(1,1), 
    personID int, 
    number varchar(8),
    phoneType varchar(10),

    foreign key (personID) references #person,
    primary key (phoneID) 
)

declare @scope int
declare @KimsID int

insert into #person (name, birthdate, gender, roomnumber) values ('Mike','11-22-1979','M',22)
insert into #person (name, birthdate, gender, roomnumber) values ('Kim','11-12-1985','F',123) 

set @scope = SCOPE_IDENTITY()
set @KimsID = SCOPE_IDENTITY()

insert into #phoneNumbers (personID, number, phoneType) values (@scope, '333-2323', 'Home')
insert into #phoneNumbers (personID, number, phoneType) values (@scope, '333-1111', 'Cell')
insert into #phoneNumbers (personID, number, phoneType) values (@scope, '555-6767', 'Other')


insert into #person (name, birthdate, gender, roomnumber) values ('Lizz','7-26-1984','F',4) 
set @scope = SCOPE_IDENTITY()
insert into #phoneNumbers (personID, number, phoneType) values (@scope, '444-4444', 'Home')



select  #person.personID, 
        name, 
        (datediff(YY, birthdate, getdate()) -
            case
                when((month(birthdate)*100 + day(birthdate)) >
                    (month(getdate())*100 + day(getdate()))) 
                then 1
            else 0
            end) as age,
        birthdate, 
        gender, 
        roomnumber,

        number,
        phoneType 

from    #person 
        left outer join #phoneNumbers 
        on #phoneNumbers.personID = #person.personID 

--where #person.personID = @KimsID 

order by #person.name, phoneType 

drop table #person
drop table #phoneNumbers

Ответы [ 2 ]

3 голосов
/ 03 марта 2011

Исходная форма содержит денормализованные данные, так как в одной ячейке есть много телефонных номеров.Ваша база данных имеет хорошую нормализованную структуру.Это то, что делает вещи сложнее.Самый простой способ получить то, что вы хотите, - это денормализовать данные перед отправкой в ​​службы отчетности.Это означает получение всех телефонных номеров для человека и помещение их в строку.

Я взял ваш сценарий и изменил временные таблицы на постоянные.Затем я добавил следующую функцию, чтобы получить денормализованные данные телефона:

create function fnGetDenormPhoneFromPersonID(@personID int)
returns varchar(8000)
as
begin
    declare @number varchar(8);
    declare @phoneType varchar(10);

    declare @DenormPhone varchar(8000);
    set @DenormPhone = '';

    declare MyCursor cursor for
    select number, phoneType
    from phoneNumbers
    where personID = @personID;

    open MyCursor

    fetch next from MyCursor into @number, @phoneType;

    while @@FETCH_STATUS = 0
    begin
        set @DenormPhone = @DenormPhone + @phoneType + '   ' + @number + ';'
        fetch next from MyCursor into @number, @phoneType;
    end

    close MyCursor
    deallocate MyCursor

    return @DenormPhone

end

Затем используйте следующую команду select:

    select  person.personID, 
    name, 
    (datediff(YY, birthdate, getdate()) -
        case
            when((month(birthdate)*100 + day(birthdate)) >
                (month(getdate())*100 + day(getdate()))) 
            then 1
        else 0
        end) as age,
    birthdate, 
    gender, 
    roomnumber,
    dbo.fnGetDenormPhoneFromPersonID(personID) as DenormPhone

from    person 

и поместите ее в стандартную таблицу, созданную дизайнером отчетов, свсе поля в деталях.

Я изменил выражение для Denorm Phone на

=Replace(Fields!DenormPhone.Value, ";", vbCRLF)

Report Screenshot

1 голос
/ 02 марта 2011

В SSRS 2005 матрицы, списки и таблицы были разными вещами.В 2008 году они объединили их в таблицу.У вас все еще есть все три элемента управления, но под ними все находятся в виде табликса с разными значениями по умолчанию.

Похоже, вы хотите использовать матрицу с 3 уровнями.

  1. Аллергия
  2. ID и затем добавьте дополнительные столбцы для комнаты, пола и места жительства.
  3. Подробности - на самом деле это не группа, поскольку она не группируется ни для чего только для отображения оставшихся строк.
...