SSRS - 如何格式化 SQL 数据以生成时间序列的折线图?
SSRS - How do I format SQL data to generate line chart of time series?
我有一个 table 设置为
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 或 2?该字段将用作您的 图表系列 。称之为 ENTRY_YEAR.
第二个是日期字段,其中年份都设置为当前年份。您可以只添加第一个字段中的整数。这会将您的所有数据标准化为一年的时间线。您实际上不会使用年份 - 这只是为了在年休假时分隔数据。
=DATEADD("y", ENTRY_YEAR, Fields!EntryDate.Value)
我敢肯定还有一百万种更优雅的方法可以做到这一点,但这是我可能会采用的方法...
以下内容基于 Microsoft 提供的 NorthWind 数据库,因此如果您确实需要,可以重新创建它...
我在这里设置了实际的开始和结束日期值,但您可以注释掉前几行,然后您的 SSRS 参数将被应用。
所以从接受订单开始 table 因为它有一些日期并加入了一些基本的订单数据所以我可以看到结果看起来不错,大部分列都没有使用。
我的数据集是这样的...
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
在那里,因为我假设你会想要 'stack' 线,也就是说,6 月 1 日,所有三个组都处于相同的水平位置在图表上。 ** 请参阅稍后的说明以更改此内容。
WHERE
子句进行类似的测试以确保我们仅 return 数据来自我们需要的范围。
我所做的只是添加一个折线图并设置
- 系列分组到
[YearGroup]
字段
[OrderMonth]
和 [OrderDay] 到 CategoryGroup
- 并且(没有其他原因,因为我没有太多其他东西可以显示)我使用 OrderID 的总和作为值。
** 如果要将时间范围表示为一个连续时间,则从类别组中删除 OrderMonth 和 OrderDay 并替换为 OrderDate
生成的图表看起来很糟糕,但这完全取决于数据。
我有一个 table 设置为
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 或 2?该字段将用作您的 图表系列 。称之为 ENTRY_YEAR.
第二个是日期字段,其中年份都设置为当前年份。您可以只添加第一个字段中的整数。这会将您的所有数据标准化为一年的时间线。您实际上不会使用年份 - 这只是为了在年休假时分隔数据。
=DATEADD("y", ENTRY_YEAR, Fields!EntryDate.Value)
我敢肯定还有一百万种更优雅的方法可以做到这一点,但这是我可能会采用的方法...
以下内容基于 Microsoft 提供的 NorthWind 数据库,因此如果您确实需要,可以重新创建它...
我在这里设置了实际的开始和结束日期值,但您可以注释掉前几行,然后您的 SSRS 参数将被应用。
所以从接受订单开始 table 因为它有一些日期并加入了一些基本的订单数据所以我可以看到结果看起来不错,大部分列都没有使用。
我的数据集是这样的...
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
在那里,因为我假设你会想要 'stack' 线,也就是说,6 月 1 日,所有三个组都处于相同的水平位置在图表上。 ** 请参阅稍后的说明以更改此内容。
WHERE
子句进行类似的测试以确保我们仅 return 数据来自我们需要的范围。
我所做的只是添加一个折线图并设置
- 系列分组到
[YearGroup]
字段 [OrderMonth]
和 [OrderDay] 到 CategoryGroup- 并且(没有其他原因,因为我没有太多其他东西可以显示)我使用 OrderID 的总和作为值。
** 如果要将时间范围表示为一个连续时间,则从类别组中删除 OrderMonth 和 OrderDay 并替换为 OrderDate
生成的图表看起来很糟糕,但这完全取决于数据。