我试图在报告中创建一个表格,如下所示:
数据集基于此查询:
SELECT
DATENAME(dw, CurrentReadTime) AS 'DAY',
DATEPART(dw, CurrentReadTime) AS 'DOW',
CAST(datename(HH, CurrentReadTime) as int) AS 'HOD',
AVG([Difference]) AS 'AVG'
FROM
Consumption
INNER JOIN Readings ON Readings.[RadioID-Hex] = Consumption.[RadioID-Hex]
WHERE
CONCAT([Building], ' ', [Apt]) = @ServiceLocation
GROUP BY
CurrentReadTime
ORDER BY
DATEPART(DW, CurrentReadTime),
CAST(DATENAME(HH, CurrentReadTime) AS INT)
此表中的数据返回如下:
在报表生成器中,我已将此代码添加到报表属性中:
Function GetRangeValueByHour(ByVal Hour As Integer) As String
Select Case Hour
Case 6 To 12
GetRangeValueByHour = "Morning"
Case 12 to 17
GetRangeValueByHour = "Afternoon"
Case 17 to 22
GetRangeValueByHour = "Evening"
Case Else
GetRangeValueByHour = "Overnight"
End Select
Return GetRangeValueByHour
End Function
并将此代码添加到“行组”中:
=Code.GetRangeValueByHour(Fields!HOD.Value)
当我执行报告,选择目标服务位置的参数时,我得到以下结果:
正如您将注意到的,“时间”显示的第一个结果符合报告属性代码中的CASE表达式;但是,我确认通过对此结果执行SUM来将所有“HOD”(存储为整数)组合在一起 .
此外,实际表值(.05,.08等)仅返回首先满足VB代码中CASE语句要求的HOD结果 .
这些是我需要解决的问题,但无法弄清楚:
-
为什么报告属性VB代码在时间时间列中不显示"Morning","Afternoon","Evening"和"Overnight"?
-
如何将表中的值组合在一起?因此AVG实际上是指定范围内和星期几内所有小时的每个AVG的总和(周一,周二等6-12,12-18等) .
对于仍在阅读的人,感谢您的帮助!如果您需要其他信息,请与我们联系 .
1 回答
我想象这是一个按照这个表达式分组的单行组:
=Code.GetRangeValueByHour(Fields!HOD.Value)
. 基于此设计和上面的数据集,以下是我将如何解决您的两个问题:SUM
. 示例:Sunday的表达式为=SUM(IIF(Fields!DOW.Value = 1, Fields!AVG.Value, CDec(0)))
. 这使用CDec(0)
而不是0,因为AVG值是小数,而SSRS将通过将0解释为int而抛出混合数据类型错误的聚合 .