我有一个数据集,可以计算每小时生产的托盘数量,例如
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之间存在差距,因为该小时没有数据。使用具有时间尺度x轴的图表在SSRS 2005中可视化该数据。当图形类型为“列”时,完全没有问题,因为02:00可视化为没有(0)值,并且图中的间隙很明显。当图形类型为“Line”或“Area”时,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)
应该解释这个问题。
有谁知道如何解决这个问题?谢谢!
答案 0 :(得分:3)
可能你现在找到了问题的答案。这适用于可能偶然发现这个问题的其他人。只有在使用 SQL Server 2005 or above
作为报告的数据源时,此解决方案才适用。该示例使用Common Table Expressions (CTE)
来实现问题中提到的所需结果。下面提到的示例使用SSRS 2005
和SQL Server 2008 R2
数据库。 SQL Server 2005 or above
支持CTE。
分步流程:
创建一个名为dbo.TimeScaleData
的表,并填充问题中提供的数据。请参阅屏幕截图# 1 。在 SQL脚本部分下提供了表的脚本。
创建一个CTE,它将获取表dbo.TimeScaleData
中的最小和最大日期值,并生成给定范围之间每小时的所有时间值。然后在CTE和表OUTER APPLY
之间使用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 DataSet查询:
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: