【问题标题】:SSRS Report Multi Parameters (start date,end date, MeterId, Displayby)SSRS 报表多参数(开始日期、结束日期、MeterId、Displayby)
【发布时间】:2023-03-18 10:00:01
【问题描述】:

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

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

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

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

如果显示是小时,我们将显示该日期范围内 MeterId、Quantity、Price 的所有 24 小时值。

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

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

如果显示为年份,我们将显示该日期范围内 MeterId 的总数量和总价格。例如,如果我选择开始日期为 1-1-2016,结束日期为 12-31-2016。我的结果应该显示每个月的 12 行,其中包含该特定 MeterID 的总数量和总价。

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

请提出你的想法...

行分组:

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

预期结果:

SSRS 电流输出:不匹配

【问题讨论】:

  • 我建议您告诉我们您的具体问题是什么。目前,您只是在描述您的项目,没有提出任何问题。
  • 对不起,因为我的数据库表存储了所有小时值,如果用户选择显示下拉菜单作为小时,我知道如何在屏幕上显示这些值。但是,不知道如何显示日/月/年的结果。我需要使用“case”语句吗?如果需要,我应该在显示参数上给出什么。有点困惑。

标签: sql sql-server tsql reporting-services


【解决方案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)

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

根据我在上面看到的内容,您需要在组表达式之前为客户添加一个分组级别。另外,你的 Quantity 表达式应该是这样的总和

=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,如果不只是换掉名称。

【讨论】:

  • 感谢您的评论。欣赏它。我的数据集具有以下内容(MeterId、ReadingDate、Hour、Price、Quantity、Reading_Day、Reading_Month、Reading_Year)。在参数上,我将 Reportby 设置为 Integer,并将 Hour 设置为 1,Day 设置为 2,Month 设置为 3,Year 设置为 4。然后在 RowGrouping 上,我使用了您的(Switch 语句)。它似乎正在工作,但我得到的结果不正确。是否必须在 SSRS 报告中同时使用(Switch 语句和 Select 查询)?
  • 我只使用了 Switch 语句。此外,我的数据库表不存储月份或年份。它有以下列:Meterid、ReadingDate (dateTime)、ReadingHour (integer)、Price decimal、Usage (integer)。
  • 您只需要一个或另一个,SSRS 分组可能很慢,这就是为什么我建议您可能希望在 SQL 中完成工作。您能否添加表格的屏幕截图以及屏幕底部显示的分组。然后,如果您可以显示具有预期结果的数据样本,这将有所帮助。
  • 我无法使用 SQL 语句,因为数据库表没有单独存储月份和年份。我们只有一个名为“ReadingDate”的列,它的数据类型是 DataTime。我还添加了所需输出屏幕截图的示例,我希望使用 SSRS 来展示它。屏幕截图添加在初始问题本身中。
  • 您可以将您的数据集查询发布到。您发布的示例数据与预期结果不符,因此我无法真正看到您得到了什么。所以,数据集查询,样本数据,基于样本的当前结果和基于样本的预期结果。
猜你喜欢
  • 1970-01-01
  • 2019-12-10
  • 1970-01-01
  • 2012-08-19
  • 1970-01-01
  • 2022-01-23
  • 1970-01-01
  • 1970-01-01
  • 2018-11-03
相关资源
最近更新 更多