SSRS - Как мне отформатировать данные SQL для создания линейного графика временных рядов? - PullRequest
0 голосов
/ 05 декабря 2018

У меня есть таблица, настроенная как

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

И отчет SSRS настроен для того, чтобы пользователь вводил @StartDate и @EndDate, чтобы превзойти [EntryDate], которые они хотят видеть.

Есть ли способ создать линейный график, который отображает значения для [PassFailElement] от @StartDate до @EndDate в качестве первой серии, DateAdd (DateInterval.Year, -1, @ StartDate) до DateAdd (DateInterval.Year, -1, @ EndDate) для второй серии, а затем два года назад для третьей серии?

Ответы [ 2 ]

0 голосов
/ 05 декабря 2018

Я уверен, что есть миллион более изящных способов сделать это, но вот как я мог бы подойти к этому ...

Следующее основано на поставляемой Microsoft базе данных NorthWind, так что вы можете воссоздать ее, еслиВы действительно хотите ...

Здесь я установил фактические значения даты начала и окончания, но вы можете закомментировать первые несколько строк, а затем будут применены ваши параметры SSRS.

Итак, для начала мы взяли таблицу заказов, так как в ней были некоторые даты, и присоединились к некоторым основным данным заказов, чтобы я мог видеть, что результаты выглядят нормально, большинство столбцов не используются.

Мой набор данных выглядит такthis ...

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 ))

Оператор Case в предложении SELECT проверяет, попадают ли даты в одну из трех групп: либо

  1. между началом и концомпредоставленные даты
  2. между тем же диапазоном дат, но минус год
  3. между тем же диапазоном дат, но минус два года

Расчетные OrderMonth и OrderDayтам, как я полагаю, вы будетеЯ захочу «сложить» линии, скажем, 1 июня, во всех трех группах в одной горизонтальной позиции на графике.** См. Примечания ниже для изменения этого.

Предложение WHERE выполняет аналогичные тесты, чтобы убедиться, что мы возвращаем данные только из тех диапазонов, которые нам нужны.

Все, что я сделал, это просто добавиллинейный график и установите

  • Группы рядов в поле [YearGroup]
  • [OrderMonth] и [OrderDay] в CategoryGroup
  • и (ни для каких другихпричина, по которой у меня больше ничего не отображалось) Я использовал сумму OrderID в качестве значений.

**, если вы хотите представить временной диапазон как одно непрерывное время, затем удалите OrderMonthи OrderDay из групп категорий и замените на OrderDate

Получившийся график выглядел ужасно, но это было только до данных.

0 голосов
/ 05 декабря 2018

Я бы создал пару вычисляемых полей в вашем наборе данных, чтобы разбить данные и добавить их в диаграмму.

Первым будет поле, определяющее, в каком году данныенаходится в - Текущий, Предыдущий или Приор.Может быть, просто 0, 1 или 2?Это поле будет использоваться в качестве вашей серии графиков .Назовите его ENTRY_YEAR.

Вторым будет поле даты со всеми годами, установленными на текущий год.Вы можете просто добавить целое число из первого поля.Это нормализует все ваши данные за один год.Вы фактически не будете использовать год - это просто для разделения данных на годовой перерыв.

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

...