我有一个像这样设置的表
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)用于第二个系列,然后两年后返回第三个系列?
答案 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语句检查日期是否属于三组之一
计算得出的OrderMonth
和OrderDay
就在那儿,因为我假设您想“叠加”直线,所以说6月1日,所有三个组在图表上处于同一水平位置。 **请参阅注释,以更改此设置。
WHERE
子句进行了类似的测试,以确保我们仅返回所需范围内的数据。
我所做的只是添加一个折线图并设置
[YearGroup]
字段的系列组[OrderMonth]
和[OrderDay] **如果要将时间范围表示为一个连续时间,请从类别组中删除OrderMonth和OrderDay并替换为OrderDate
生成的图表看起来很糟糕,但这仅取决于数据。