(更新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。我尝试将服务器名称添加到这些名称中,但收到一条消息“不允许进行远程表值函数调用。”
有什么建议吗?谢谢!
答案 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