【问题标题】:SSRS - How do I format SQL data to generate line chart of time series?SSRS - 如何格式化 SQL 数据以生成时间序列的折线图?
【发布时间】:2018-12-04 21:56:21
【问题描述】:

我有一个像这样设置的表

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) 用于第二系列,然后两年后用于第三系列?

【问题讨论】:

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


    【解决方案1】:

    我确信还有一百万种更优雅的方法可以做到这一点,但这是我可能会采用的方法......

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

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

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

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

    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] 到 CategoryGroup
    • 并且(没有其他原因,除了我没有太多要显示的内容之外)我使用 OrderID 的总和作为值。

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

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

    【讨论】:

    • 我完全只需要另一双眼睛。非常感谢!
    【解决方案2】:

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

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

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

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

    【讨论】:

    • 同样的想法,少打字:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多