Возможно, вы нашли ответ на свой вопрос сейчас. Это для тех, кто может наткнуться на этот вопрос. Это решение применимо только в том случае, если вы используете 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 Scripts .
Создайте CTE, который будет принимать минимальные и максимальные значения даты в таблице dbo.TimeScaleData
и генерировать все значения времени для каждого часа между заданным диапазоном. Затем используйте OUTER APPLY
между CTE и таблицей dbo.TimeScaleData
для извлечения данных. Любому диапазону времени, в котором нет совпадающей записи, будет присвоено значение 0. См. Снимок экрана # 2 . Этот запрос будет использоваться в отчете SSRS для создания набора данных. Запрос предоставляется SSRS DataSet Query раздел.
Снимок экрана # 3 показывает, что запрос CTE используется для создания набора данных отчета. Снимки экрана # 4 - # 7 показывают, как элемент управления Chart настроен на использование набора данных.
Снимок экрана # 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: