首页 文章

Report Builder 3.0 - 按时间对行进行分组

提问于
浏览
0

我试图在报告中创建一个表格,如下所示:

Target Table

数据集基于此查询:

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)

此表中的数据返回如下:

Data Results

在报表生成器中,我已将此代码添加到报表属性中:

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)

当我执行报告,选择目标服务位置的参数时,我得到以下结果:

Actual Result

正如您将注意到的,“时间”显示的第一个结果符合报告属性代码中的CASE表达式;但是,我确认通过对此结果执行SUM来将所有“HOD”(存储为整数)组合在一起 .

此外,实际表值(.05,.08等)仅返回首先满足VB代码中CASE语句要求的HOD结果 .

这些是我需要解决的问题,但无法弄清楚:

  • 为什么报告属性VB代码在时间时间列中不显示"Morning","Afternoon","Evening"和"Overnight"?

  • 如何将表中的值组合在一起?因此AVG实际上是指定范围内和星期几内所有小时的每个AVG的总和(周一,周二等6-12,12-18等) .

对于仍在阅读的人,感谢您的帮助!如果您需要其他信息,请与我们联系 .

1 回答

  • 0

    我想象这是一个按照这个表达式分组的单行组: =Code.GetRangeValueByHour(Fields!HOD.Value) . 基于此设计和上面的数据集,以下是我将如何解决您的两个问题:

    • 将分组表达式用于Time of Day单元格的值,如:

    Expression for Time of Day column

    • 为每周的每一天的值添加一个带有条件的 SUM . 示例:Sunday的表达式为 =SUM(IIF(Fields!DOW.Value = 1, Fields!AVG.Value, CDec(0))) . 这使用 CDec(0) 而不是0,因为AVG值是小数,而SSRS将通过将0解释为int而抛出混合数据类型错误的聚合 .

相关问题