0

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

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

应该说明问题。

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

4

1 回答 1

3

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

分步过程:

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

  2. 创建一个 CTE,它将采用表中的最小和最大日期值, dbo.TimeScaleData并生成给定范围之间每小时的所有时间值。然后OUTER APPLY在 CTE 和 table 之间使用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

于 2011-06-11T16:35:52.453 回答