SSRS-如何格式化SQL数据以生成时间序列的折线图?

时间:2018-12-04 21:56:21

标签: reporting-services charts time-series ssrs-2012

我有一个像这样设置的表

SELECT [EntryDate]        --Date
      ,[StoreId]          --Nvarchar
      ,[PassFailElement]  --Int, 1 or 0

然后设置了SSRS报告,以供用户输入@StartDate和@EndDate来预订他们想要查看的[EntryDate]。

有没有一种方法可以创建一个折线图,以显示从第一个系列的@StartDate到@EndDate的[PassFailElement]值,从DateAdd(DateInterval.Year,-1,@ StartDate)到DateAdd(DateInterval.Year), -1,@ EndDate)用于第二个系列,然后两年后返回第三个系列?

2 个答案:

答案 0 :(得分:1)

我会在您的数据集中创建几个计算字段,以分解数据并将其添加到图表中。

第一个是一个字段,用于确定数据所在的年份-当前,上一个或上一个。也许只有0、1或2?该字段将用作您的图表系列。称为ENTRY_YEAR。

第二个是日期字段,其中所有年份均设置为当前年份。您可以只从第一个字段中添加整数。这会将您的所有数据标准化为一年的时间轴。您实际上不会使用年份-只是在年末时将数据分开。

=DATEADD("y", ENTRY_YEAR, Fields!EntryDate.Value)

答案 1 :(得分:1)

我敢肯定,还有100万种优雅的方法可以做到这一点,但是这就是我可能会采用的方法...

以下内容基于Microsoft提供的NorthWind数据库,因此如果您确实想要...,可以重新创建它。

我在此处设置了实际的开始日期和结束日期,但是您可以注释掉前几行,然后将应用SSRS参数。

因此,从a开始使用订单表,因为它有一些日期,并加入了一些基本的订单数据,所以我可以看到结果看起来还可以,大部分列都没有使用。

我的数据集看起来像这样...

SET DATEFORMAT YMD

DECLARE @startDate date = '1998/04/01'
DECLARE @endDate date = '1998/07/30'

SELECT 
       e.EmployeeID, e.FirstName, e.LastName, e.Title
       , o.OrderID, o.OrderDate
       , c.CustomerID, c.CompanyName
       , CASE 
          WHEN (OrderDate between @startDate and @endDate ) THEN 'This Year' 
          WHEN (OrderDate between dateadd(YYYY,-1,@startDate) and dateadd(YYYY,-1,@endDate )) THEN 'Last Year' 
          WHEN (OrderDate between dateadd(YYYY,-2,@startDate) and dateadd(YYYY,-2,@endDate )) THEN '2 Years ago' 
         END as YearGroup
       , MONTH(OrderDate) AS OrderMonth
       , Day(OrderDate) AS OrderDay
    FROM Employees e 
       join Orders o on e.EmployeeID = o.EmployeeID
        join Customers c on o.CustomerID = c.CustomerID
    WHERE 
       (OrderDate between @startDate and @endDate )  OR
       (OrderDate between dateadd(YYYY,-1,@startDate) and dateadd(YYYY,-1,@endDate )) OR
       (OrderDate between dateadd(YYYY,-2,@startDate) and dateadd(YYYY,-2,@endDate ))

SELECT子句中的Case语句检查日期是否属于三组之一

  1. 在提供的开始日期和结束日期之间
  2. 在同一日期范围内但减去一年之间
  3. 在相同的日期范围之间,但减去两年之间

计算得出的OrderMonthOrderDay就在那儿,因为我假设您想“叠加”直线,所以说6月1日,所有三个组在图表上处于同一水平位置。 **请参阅注释,以更改此设置。

WHERE子句进行了类似的测试,以确保我们仅返回所需范围内的数据。

我所做的只是添加一个折线图并设置

  • [YearGroup]字段的系列组
  • 类别组的[OrderMonth]和[OrderDay]
  • (出于其他原因,我没有其他要显示的东西)我将OrderID的总和用作值。

**如果要将时间范围表示为一个连续时间,请从类别组中删除OrderMonth和OrderDay并替换为OrderDate

生成的图表看起来很糟糕,但这仅取决于数据。