SSRS 2008和分组列/行

时间:2011-03-02 00:33:35

标签: reporting-services grouping rows

Matrix ... tablix .... list / matrix ... list / tablix ...我不知道。没有人做我想让他们做的事。

所以,我有居民数据......姓名,性别,护理水平,房间/位置信息。我有医生的电话号码。所有这一切都看起来像我的形式,但必须在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           
哦,我做错了什么?如果我使用一个列表(对于上面的过敏文本),里面有一个表,按人物信息/人物ID /东西分组,电话号码作为详细信息我不能让人员信息排成一行,这样数字就不会只是挂在下面。

显然,我已经简化了数据,但这是它的一般概念......请给我一些建议。对于我的生活,我无法弄清楚分组。我是否需要以不同方式布置数据?

非常感谢............你的时间, 金

好的...编辑....我想我解释错了,因为有人说我的数据需要规范化。这就是我设置数据的方法,尝试在personID / person信息上使用分组,然后使用电话号码作为详细信息。

所以,假设我有一个名为person的基表,它存储了我的所有人信息。然后我有一个叫电话号码的表,它有我的号码。人和电话通过ID关联。然后我有一个过敏表,由personID关联,它有过敏ID,并有过敏文本。左外连接它们。塔达!这是一个非常大的数据库,我必须检查大量的事情,现在实际提供查询是不可行的。对不起......所有这一切都是真正简化情况的结果,但它得到了这个想法,我仍然无法完成我想要的分组,即使数据很简单(这是我要求的帮助)。

再次感谢!


我确实需要这方面的帮助,今天早上我甚至无法得到它......所以,让我们忘记上面的过敏部分让它变得非常简单。我仍然无法让分组在Person上工作,然后使用电话号码作为详细信息。这里有一些示例数据和内容....由于这个报告实际上将作为表单提供,我让用户通过参数选择他们想要的人,以便将personID传递到我的查询/存储过程中,我只会得到一个人回来,但作为一个例子,我在我的人员表中包括三个人。

这不是实际的结构或数据或查询......它只是我在10分钟内用来证明我在SSRS中进行分组的问题...所以请不要对db结构或类似的东西发表任何评论,我只是觉得如果我在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 个答案:

答案 0 :(得分:3)

原始表单具有非规范化数据,因为一个单元格中有许多电话号码。您的数据库具有良好的规范化结构。这就是让事情变得棘手的原因。获得所需内容的最简单方法是在将数据发送到报告服务之前对数据进行非规范化。这意味着获取一个人的所有电话号码并将其放入字符串中。

我拿了你的脚本,并将临时表更改为永久表。然后我添加了以下函数来获取非规范化的电话数据:

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  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 :(得分:1)

在SSRS 2005中,Matrixes和Lists and Tables都是不同的东西。 2008年,他们将它们合并为一个Tablix。您仍然拥有所有三个控件但在它们下面都是具有不同默认值的Tablix。

看起来你想使用3级矩阵。

  1. 过敏症
  2. ID,然后包含房间,性别和居民的额外列。
  3. 详细信息 - 实际上并不是一个群组,因为它不会仅仅为显示剩余的行而分组。