我有一张桌子,它是这样设置的
SELECT [EntryDate] --Date
,[StoreId] --Nvarchar
,[PassFailElement] --Int, 1 or 0
并且为用户设置SSRS报告以输入@StartDate和@EndDate来添加他们想要查看的EntryDates。
有没有办法创建一个折线图,将从@StartDate到@EndDate的PassFailElement的值显示为第一个系列,将第二个系列的DateAdd(DateInterval.Year,-1,@StartDate)显示为DateAdd(DateInterval.Year,-1,@EndDate),然后将两年前的第三个系列的值显示出来?
发布于 2018-12-05 08:59:55
我相信有一百万种更优雅的方法可以做到这一点,但以下是我可能采用的方法……
下面是基于微软提供的NorthWind数据库,所以如果你真的想要,你可以重建它。
我在这里设置了实际的开始和结束日期值,但是您可以注释掉前几行,然后应用您的SSRS参数。
因此,首先使用orders表,因为它有一些日期,并连接到一些基本的订单数据,以便我可以看到结果看起来很好,大多数列都没有使用。
我的数据集是这样的.
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添加到CategoryGroup
**如果要将时间范围表示为一个连续时间,请从类别组中移除OrderMonth和OrderDay,并替换为OrderDate
得到的图表看起来很糟糕,但这只是数据的问题。
发布于 2018-12-05 08:58:43
我将在您的数据集中创建两个计算字段,以分解数据并将其添加到图表中。
第一个字段用于确定数据是当前年份、上一年还是上一年。也许只有0、1或2?此字段将用作图表系列。叫它ENTRY_YEAR吧。
第二个是日期字段,年份都设置为当前年份。您可以只将第一个字段中的整数相加。这将使您的所有数据标准化为一年时间线。实际上,您不会使用年份--这只是为了在年假时分隔数据。
=DATEADD("y", ENTRY_YEAR, Fields!EntryDate.Value)
https://stackoverflow.com/questions/53622039
复制相似问题