如何使用SSRS从三个表中添加总计

时间:2018-08-29 21:21:40

标签: sql-server reporting-services

(更新8/30:我对帖子进行了更详细的修订,希望对大家有帮助。) 我的报表中有三个数据集-每个数据集都有来自三个不同sql服务器的文件大小详细信息。每个数据集如下:

DATASET1
SERVERNAME    DATABASE    DATATYPE    FILESIZE
s1            db1         data        5,445
s1            db1         log         2,456
s1            db2         data        6,987
s1            db2         log         9,234

DATASET2
SERVERNAME    DATABASE    DATATYPE    FILESIZE
s2            db5         data         7,145
s2            db5         log          1,223
s2            db6         data        44,345
s2            db6         log          3,456

DATASET3
SERVERNAME    DATABASE    DATATYPE    FILESIZE
s3            dba         data        1,445
s3            dba         log           456
s3            dbb         data        4,556
s3            dbb         log         1,233

每个数据集中有更多行,并且每个数据集具有不同的行数,因为每个服务器上的数据库数均不同。

我可以轻松地为每个数据集创建一个汇总表,以将每种数据类型(数据和日志)按数据类型分组,并获得如下所示的总数:

Server1         Server2         Server3
Data 34,445     Data 45,185     Data 98,334
Log  23,987     Log  12,993     Log 123,099

我想为每个数据类型行的所有三个数据集创建一个总计。

Total
Data  177,964
Log   160,079

我知道如何用SUM引用特定的数据集,但这给了我两行的SUM。我想要每个行的总和-所有三台服务器的总数据和总日志。我尝试按照建议使用查找,但这并没有给我我想要的总数。代码建议可能有用,我只是不理解并正确实施。

我的SQL正在使用sys.sysfiles,sys.database_files和sys.dm_os_volume_stats。我尝试将服务器名称添加到这些名称中,但收到一条消息“不允许进行远程表值函数调用。”

有什么建议吗?谢谢!

3 个答案:

答案 0 :(得分:0)

SUM是正确的,只需确保将包含“数据”和“日志”值的列添加到分组依据。要使其像上面一样显示,请将该字段添加到“行组”,并将大小添加到“值”。一起保留服务器名称。

答案 1 :(得分:0)

在这里是您的朋友。.您只需插入一个tablix ..将数据集分配给第一个数据集,然后从那里获取值。.添加另一列,然后像这样对您的其他数据集进行查找

对于第二列中的“数据”行,您将具有以下内容:

=Lookup(Fields!Data.Value, Fields!Data.Value,  Fields!Data.Value, "Dataset2")

对于第二列中的日志行,您将具有以下内容:

   =Lookup(Fields!log.Value, Fields!log.Value,  Fields!log.Value, "Dataset2")

添加另一列并重复以上操作..除了它将来自Dataset3

现在,所有三列都来自三个不同的数据集。您只需要插入另一列并做报告项的总和即可!

然后,您可以选择隐藏其他三个,并仅显示求和列或全部显示。.

答案 2 :(得分:0)

假设您有2个数据集,其中包含以下数据:

Server1Data        Server1Number
34,445             1
12                 2

Server2Data        Server2Number
45,185             1
3                  2
5                  2

您的Tablix绑定到Server1DatasetName。使用查找,您将获得以下结果:

=Fields!Server1Data.Value 'Column1 expression
=Lookup(Fields!Server1Number.Value, Fields!Server2Number.Value, Fields!Server2Data.Value, "Server2DatasetName") 'Column2 expression

Column1    Column2
------------------
34,445     45,185
------------------
12         3      'The first match he finds

使用 LookupSet ,您将获得以下结果:

=Fields!Server1Data.Value 'Column1 expression
=Join(LookupSet(Fields!Server1Number.Value, Fields!Server2Number.Value, Fields!Server2Data.Value, "Server2DatasetName"), VbCrlf)

Column1    Column2
------------------
34,445     45,185
------------------
12         3
           5      'Both matches seperated with VbCrlf in one row
------------------

但是还有第三种选择。您将此功能放在了报表属性中的代码下。

Function SumLookup(ByVal items As Object()) As Decimal  

If items Is Nothing Then  
    Return Nothing  
End If  
Dim sum As Decimal = New Decimal()  
sum = 0  
For Each item As Object In items  
    sum += Convert.ToDecimal(item)  
Next  
return sum 

End Function

现在在您的Tablix中:

=Fields!Server1Data.Value 'Column1 expression
=Code.SumLookup(LookupSet(Fields!Server1Number.Value, Fields!Server2Number.Value, Fields!Server2Data.Value, "Server2DatasetName")) 'Column2 expression

Column1    Column2
------------------
34,445     45,185
------------------
12         8     'Sum of both matches