SSRS报告多参数(开始日期,结束日期,MeterId,Displayby)

时间:2017-04-19 14:04:49

标签: sql sql-server tsql reporting-services

在我的SSRS报告中,有4个参数StartDate,EndDate,MeterId和& DisplayBy

开始日期:datetime数据类型 EndDate:datetime数据类型 MeterId:是一个下拉列表,它将根据SQL查询填充 DisplayBy:是一个下拉列表,它具有以下值(小时,天,月和年)

enter image description here

存储Meters每小时值的数据库,以下是数据库表列:(MeterId,ReadingDate,Hours,Quantity,Price)

当我选择开始日期,结束日期和仪表ID并显示我想要根据开始日期和时间显示报告。结束,然后按显示值。

如果显示为小时,我们会显示日期范围的MeterId,Quantity,Price的所有24小时值。

如果显示为白天,我们会显示该日期范围内MeterId的显示总数量和总价。

如果显示为月,我们会显示该日期范围的MeterId的总数量和总价。

如果显示为年份,我们获得该日期范围的MeterId的显示总数量和总价。比如说如果我选择开始日期为1-1-2016,结束日期为12-31-2016。我的结果应该显示每个月12行的总数量,该特定MeterID的总价格。

如果用户选择显示下拉列表作为小时,我的数据库表存储我知道如何在屏幕上显示值的所有小时值。但是,不知道如何显示日/月/年的结果或如何分组。我是否需要使用“case”语句,如果是,我需要在显示参数上给出什么。

请提出您的想法......

行分组: enter image description here

    SELECT I.CustomerName, I.ReadingDate, I.IntegratedHour, I.IntegratedUsage, I.IntegratedGeneration, DATEPART(dd, I.ReadingDate) AS [Reading Day], DATEPART(mm, 
                  I.ReadingDate) AS [Reading Month], DATEPART(yyyy, I.ReadingDate) AS [Reading Year]
FROM         IntegratedHour_MV90 AS I INNER JOIN
                      CustRptMeterExtract AS CT ON CT.CustomerName = I.CustomerName
WHERE     (I.ReadingDate >= @StartDate) AND (I.ReadingDate <= @EndDate) AND (I.CustomerName IN (@FacilityName))

预期成果: enter image description here enter image description here

SSRS电流输出:不匹配 enter image description here

1 个答案:

答案 0 :(得分:1)

根据您的布局,您可以将行分组设置为类似

的表达式
=SWITCH
(
Parameters!ReportBy.Value=1, Fields!Hour.Value,
Parameters!ReportBy.Value=2, Fields!Day.Value,
Parameters!ReportBy.Value=3, Fields!Month.Value,
Parameters!ReportBy.Value=4, Fields!Year.Value,
True, 0)

这假设您已经有数据集中的小时/天/月/年,如果没有,那么您必须用表达式替换字段引用以返回相关月份等。

根据我上面看到的内容,您需要在组表达式之前为Customer添加分组级别。此外,您的数量表达式应该是这样的总和

=SUM(FIelds!IntegratedGeneration.Value) 

你可能仍然有问题。我假设价格是一个单价,所以总结它也没有意义。为了解决这个问题,您应该计算数据集中的LineValue(Qty * Price),然后将价格表达式更改为

=(SUM(FIelds!LineValue.Value)/SUM(Fields!IntegratedGeneratio‌​n.Value)) 

这将为您提供平均价格。

但是,这可能很慢,我个人会在您的数据集中完成工作。再假设你在表中有几个月,那么你可以做这样的事情。

--DECLARE @ReportBy int = 1 -- uncomment for testing

select 
    MeterID, Price
    , CASE @ReportBy 
        WHEN 1 THEN [Month]
        WHEN 2 THEN [Year]
        ELSE NULL
     END AS GroupByColumn
INTO #t
 from dbo.MyDataTable

 SELECT 
    GroupByColumn
    , SUM(Price) as Price
FROM #t
    Group BY GroupByColumn
    Order by GroupByColumn

这假定您的报告参数名为ReportBy,如果不是只是将名称换掉。