2017-04-19 101 views
-2

在我SSRS报告有4个参数的开始日期,结束日期,MeterId,& DisplayBySSRS报告多参数(开始日期,结束日期,MeterId,Displayby)

开始日期:datetime数据类型 结束日期:datetime数据类型 MeterId :是一个下拉列表,这将填充基于SQL查询 DisplayBy:是一个下拉列表,这具有以下值(小时,天,月&年)

enter image description here

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

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

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

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

如果显示的是月份,我们会得到该日期范围的MeterId的总数量和总价格。

如果显示的是Year,我们就得到了该日期范围的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

+0

我建议你告诉我们你的具体问题是什么。目前,您只是在不提问的情况下描述您的项目。 – Filburt

+0

我很抱歉,因为我的数据库表存储了所有小时值,我知道如何在用户选择显示下拉菜单时显示屏幕上的值。但是,不知道如何显示日/月/年的结果。我是否需要使用“case”语句,如果需要,我需要在显示参数上给出什么。有点困惑。 – tedstrich

回答

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) 

这里假设你已经有小时/天/月/在你的数据集里,如果没有,那么你就必须更换带有表达式的字段引用以返回相关的月份等。

根据我上面可以看到的内容,您需要在组表达式之前为客户添加分组级别。此外,您数量的表述应该是一笔这样的

=SUM(FIelds!IntegratedGeneration.Value) 

您可能仍然有一个问题,虽然。我假设Price是一个单位价格,所以它也没有意义。为了避开这个,你应该计算LineValue(数量*价格)在数据集中,然后更改价格表现要像

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

+0

感谢您的评论。欣赏它。我的数据集包含以下内容(MeterId,ReadingDate,Hour,Price,Quanity,Reading_Day,Reading_Month,Reading_Year)。在参数上,我将Reportby设置为整数,并将Hour指定为1,将Day设置为2,将月份设置为3并将年份设置为as4。然后在RowGrouping上使用你的(Switch语句)。它似乎在工作,但我得到的结果是不正确的。是否必须在SSRS报告中同时使用(Switch语句和Select查询)? – tedstrich

+0

我只使用Switch语句。此外,我的数据库表不存储月份或年份。它具有以下列:Meterid,ReadingDate(dateTime),ReadingHour(整数),Price decimal,Usage(整数)。 – tedstrich

+0

你只需要一个或另一个,SSRS分组可能会很慢,这就是为什么我建议你可能想用SQL来完成这项工作。你可以添加表格的屏幕截图以及出现在屏幕底部的分组。然后,如果您可以显示预期结果的数据样本,这将有所帮助。 –

相关问题