Линейный график SSRS: шкала времени оси X с пробелами в данных - PullRequest
0 голосов
/ 15 ноября 2010

У меня есть набор данных, который подсчитывает количество произведенных поддонов в час, например,

11/11/2010 22:00 -> 22 * ​​1003 * 11/11/2010 23:00 -> 12
11/12/2010 00:00 -> 18
11/12/2010 01:00 -> 19
11/12/2010 03:00 -> 20

Как вы можете заметить, между 01:00 и 03:00 существует разрыв, поскольку данных за этот час нет. Эти данные визуализируются в SSRS 2005 с помощью графика с осью X шкалы времени. Когда типом графика является «Столбец», проблем вообще не возникает, поскольку 02:00 отображается без значения (0), а разрыв хорошо виден на графике. Когда типом графика является «Линия» или «Площадь», на графике также отображается 02:00, но без значения 0: между значением 01:00 и 03:00 имеется линия соединения. Глядя на линейный график, можно сделать вывод, что в 02:00 было производство, но это не так, это просто линия, которая соединяет значение 01:00 со значением 03: 00.

Пример тех же данных на графике площади alt text (исходное изображение: http://img577.imageshack.us/img577/9616/area.jpg)

и граф столбцов alt text (исходное изображение: http://img577.imageshack.us/img577/7590/column.jpg)

должен объяснить проблему.

Кто-нибудь знает, как решить эту проблему? Спасибо!

1 Ответ

3 голосов
/ 11 июня 2011

Возможно, вы нашли ответ на свой вопрос сейчас. Это для тех, кто может наткнуться на этот вопрос. Это решение применимо только в том случае, если вы используете SQL Server 2005 or above в качестве источника данных для отчетов. В примере используется Common Table Expressions (CTE) для достижения желаемых результатов, упомянутых в вопросе. В приведенном ниже примере используются базы данных SSRS 2005 и SQL Server 2008 R2. CTE поддерживаются в SQL Server 2005 or above.

Пошаговый процесс:

  1. Создайте таблицу с именем dbo.TimeScaleData и заполните данными, приведенными в вопросе. Смотрите скриншот # 1 . Создание сценариев таблицы предоставляется в разделе SQL Scripts .

  2. Создайте CTE, который будет принимать минимальные и максимальные значения даты в таблице dbo.TimeScaleData и генерировать все значения времени для каждого часа между заданным диапазоном. Затем используйте OUTER APPLY между CTE и таблицей dbo.TimeScaleData для извлечения данных. Любому диапазону времени, в котором нет совпадающей записи, будет присвоено значение 0. См. Снимок экрана # 2 . Этот запрос будет использоваться в отчете SSRS для создания набора данных. Запрос предоставляется SSRS DataSet Query раздел.

  3. Снимок экрана # 3 показывает, что запрос CTE используется для создания набора данных отчета. Снимки экрана # 4 - # 7 показывают, как элемент управления Chart настроен на использование набора данных.

  4. Снимок экрана # 8 показывает вывод отчета по данным в таблице SQL Server.

Надеюсь, это поможет.

Сценарии SQL:

CREATE TABLE [dbo].[TimeScaleData](
    [Id] [int] IDENTITY(1,1) NOT NULL,
    [DateTimeValue] [datetime] NULL,
    [PalletsProduced] [int] NULL,
 CONSTRAINT [PK_TimeScaleData] PRIMARY KEY CLUSTERED ([Id] ASC)) ON [PRIMARY]
GO

Запрос набора данных SSRS:

DECLARE @StartDateTime  AS DATETIME;
DECLARE @EndDateTime    AS DATETIME;

SELECT  @StartDateTime  = MIN(DateTimeValue)
    ,   @EndDateTime    = MAX(DateTimeValue)
FROM    dbo.TimeScaleData;  

WITH CTE(DateTimeRange) AS
(
        SELECT  @StartDateTime AS DateTimeRange
    UNION ALL
        SELECT  DATEADD(HOUR, 1, DateTimeRange)
        FROM    CTE
        WHERE   DATEADD(HOUR, 1, DateTimeRange) <= @EndDateTime
)
SELECT          CTE.DateTimeRange
            ,   COALESCE(TSD.PalletsProduced, 0) AS PalletsProduced
FROM            CTE
OUTER APPLY     (
                    SELECT  PalletsProduced
                    FROM    dbo.TimeScaleData TSD
                    WHERE   TSD.DateTimeValue = CTE.DateTimeRange
                ) TSD;

Скриншот № 1:

1

Скриншот №2:

2

Снимок экрана № 3:

3

Снимок экрана № 4:

4

Скриншот № 5:

5

Снимок экрана № 6:

6

Снимок экрана № 7:

7

Снимок экрана № 8:

8

...