在我的SSRS报告中,有4个参数StartDate,EndDate,MeterId和& DisplayBy
开始日期:datetime数据类型 EndDate:datetime数据类型 MeterId:是一个下拉列表,它将根据SQL查询填充 DisplayBy:是一个下拉列表,它具有以下值(小时,天,月和年)
存储Meters每小时值的数据库,以下是数据库表列:(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))
答案 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!IntegratedGeneration.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,如果不是只是将名称换掉。