Sql server 如何使用SSR从三个表中添加总计

Sql server 如何使用SSR从三个表中添加总计,sql-server,reporting-services,Sql Server,Reporting Services,(更新8/30:我用更多细节修改了我的帖子,希望这能帮助大家。) 我的报告中有三个数据集,每个数据集都有来自三个不同sql Server的文件大小详细信息。每个数据集如下所示: DATASET1 SERVERNAME DATABASE DATATYPE FILESIZE s1 db1 data 5,445 s1 db1 log 2,456 s1 db2

(更新8/30:我用更多细节修改了我的帖子,希望这能帮助大家。) 我的报告中有三个数据集,每个数据集都有来自三个不同sql Server的文件大小详细信息。每个数据集如下所示:

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
每个数据集中有更多的行,每个数据集中有不同的行数,因为每个服务器上的数据库数不同

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

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引用特定的数据集,但这就是两行的总和。我想要每一行的总和——所有三台服务器的总数据和总日志。我已经尝试过按建议使用查找,但这并没有给我想要的总数。代码建议可能有效,我只是不理解它并正确地实现它

我的sql使用sys.sysfiles、sys.database_文件和sys.dm_os_volume_stats。我尝试将服务器名称添加到这些名称中,但收到一条消息“不允许远程表值函数调用”


有什么建议吗?谢谢

SUM是正确的,只需确保将包含“Data”和“Log”值的任何列添加到group by中即可。要使其像上面一样显示,请将该字段添加到“行组”中,并将大小添加到值中。请将服务器名称全部删除。

查找是您的朋友。。您只需插入一个tablix即可。。将数据集分配给第一个数据集并从中获取值。。添加另一列,然后对其他数据集执行类似的查找

对于第二列中的数据行。。你会有这样的想法:

=Lookup(Fields!Data.Value, Fields!Data.Value,  Fields!Data.Value, "Dataset2")
   =Lookup(Fields!log.Value, Fields!log.Value,  Fields!log.Value, "Dataset2")
用于第二列中的日志行。。你会有这样的想法:

=Lookup(Fields!Data.Value, Fields!Data.Value,  Fields!Data.Value, "Dataset2")
   =Lookup(Fields!log.Value, Fields!log.Value,  Fields!log.Value, "Dataset2")
添加另一列并重复上述操作。。除非它来自数据集3

现在,所有三列都来自三个不同的数据集。。您只需要插入另一列并对reportitems进行求和


然后,您可以选择隐藏其他三个,只显示sum列或显示所有列。。根据您的需要

假设您有两个包含以下数据的数据集:

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
=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
------------------
使用LookupSet可以得到以下结果:

=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
=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

对不起,我弄糊涂了。我不确定这是否会将每个数据集/表格中的总数加在一起。我创建了一个表,并且必须将其分配给一个数据集。我有一列表示数据类型(有两行,“data”和“Log”),一列表示总大小,结果表显示两行和一列标题行。在总大小表达式中,我可以说sum(filesize,“server1”)+sum(filesize,“server2”)+sum(filesize,“server3”),但这给了我该数据集的总大小,我想要每个数据集中每行的总大小。我以前没有使用过查找,听起来很有希望!谢谢,我会让你知道它是如何工作的。要么我没有正确使用它,要么它不工作。这三个数据集之间唯一的共同点是数据类型,“数据”和“日志”。每个数据集都包含详细信息,有很多“数据”和“日志”行。查找仅获取找到的第一个“数据”和“日志”行。我想要每个数据集中所有“数据”行和所有“日志”行的总和。对不起,我解释得不够清楚。谢谢好啊那样的话。。使用lookupper而不是Lookup。。我只是同意你的问题,这很有趣。我没有很好地理解这一点,但我想我已经被睡眠唤醒了,我没有很好地解释事情。我打算用更多细节修改我的原始帖子-顺便说一句,这对我来说不起作用。您缺少一个键,它将每个数据集的一行合并到一个全局行,其中包含所有三个数据集的所有信息。没有钥匙,你需要一个解决办法。你可以做的是,在你的报告中放一个文本框,并将其引用到你的汇总表中。在此文本框中写入
=ReportItems!Server1DataTextboxName.Value+ReportItems!Server2DataTextboxName.Value+ReportItems!Server3DataTextboxName
。当您单击值34445/45185/98334时,将在“名称”下的属性中获得名称