SSRS线图:x轴时间尺度,数据间隙

时间:2010-11-15 13:06:28

标签: reporting-services axis scalar

我有一个数据集,可以计算每小时生产的托盘数量,例如

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的值相连的线。

区域图alt text中的相同数据示例(原始图片:http://img577.imageshack.us/img577/9616/area.jpg

和列图alt text(原始图片:http://img577.imageshack.us/img577/7590/column.jpg

应该解释这个问题。

有谁知道如何解决这个问题?谢谢!

1 个答案:

答案 0 :(得分:3)

可能你现在找到了问题的答案。这适用于可能偶然发现这个问题的其他人。只有在使用 SQL Server 2005 or above 作为报告的数据源时,此解决方案才适用。该示例使用Common Table Expressions (CTE)来实现问题中提到的所需结果。下面提到的示例使用SSRS 2005SQL Server 2008 R2数据库。 SQL Server 2005 or above支持CTE。

分步流程:

  1. 创建一个名为dbo.TimeScaleData的表,并填充问题中提供的数据。请参阅屏幕截图# 1 。在 SQL脚本部分下提供了表的脚本。

  2. 创建一个CTE,它将获取表dbo.TimeScaleData中的最小和最大日期值,并生成给定范围之间每小时的所有时间值。然后在CTE和表OUTER APPLY之间使用dbo.TimeScaleData来获取数据。任何没有匹配记录的时间范围都将被赋值为0.请参阅屏幕截图# 2 。此查询将在SSRS报告中用于创建数据集。该查询提供了 SSRS数据集查询部分。

  3. 屏幕截图# 3 显示正在使用CTE查询来创建报告数据集。屏幕截图# 4 - # 7 显示图表控件如何配置为使用数据集。

  4. 屏幕截图# 8 显示针对SQL Server表中数据的报告输出。

  5. 希望有所帮助。

    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:

    1

    屏幕截图#2:

    2

    屏幕截图#3:

    3

    屏幕截图#4:

    4

    屏幕截图#5:

    5

    屏幕截图#6:

    6

    屏幕截图#7:

    7

    屏幕截图#8:

    8