График линейки SSRS: оси X-масштаб с пробелами в данных
-
10-10-2019 - |
Вопрос
У меня есть набор данных, который подсчитывает количество полученных поддонов в час, например,
11/11/2010 22:00 --> 22
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.
Пример тех же данных на графике области (исходное изображение: http://img577.imageshack.us/img577/9616/area.jpg)
и график столбца (исходное изображение: http://img577.imageshack.us/img577/7590/column.jpg)
должен объяснить проблему.
Кто -нибудь знает, как решить эту проблему? Благодарю вас!
Решение
Возможно, сейчас вы нашли ответ на свой вопрос. Это для тех, кто может наткнуться на этот вопрос. Это решение применимо, только если вы используете SQL Server 2005 or above
в качестве источника данных для отчетов. Пример использует Common Table Expressions (CTE)
Чтобы достичь желаемых результатов, упомянутых в вопросе. Пример, упомянутый ниже, использует SSRS 2005
а также SQL Server 2008 R2
база данных. CTE поддерживаются в SQL Server 2005 or above
.
Пошаговый процесс:
Создайте таблицу с именем
dbo.TimeScaleData
и заполняется данными, представленными в вопросе. Обратитесь к скриншоту #1. Анкет Создать сценарии таблицы представлены под Скрипты SQL раздел.Создайте CTE, который займет минимальные и максимальные значения даты в таблице
dbo.TimeScaleData
и генерируйте все временные значения на каждый час между данным диапазоном. Затем используйтеOUTER APPLY
между CTE и таблицейdbo.TimeScaleData
Чтобы получить данные. Любой диапазон времени, у которого нет соответствующей записи, будет назначено значение 0. См. Скриншот #2. Анкет Этот запрос будет использоваться в отчете SSRS для создания набора данных. Запрос предоставлен Запрос набора данных SSRS раздел.Скриншот #3 Показывает, что запрос CTE используется для создания набора данных отчета. Скриншоты #4 - #7 Показывает, как настроен управление диаграммой для использования набора данных.
Скриншот #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:
Скриншот № 2:
Скриншот № 3:
Скриншот № 4:
Скриншот № 5:
Скриншот № 6:
Скриншот № 7:
Скриншот № 8: