0

1 時間あたりの生産パレット数をカウントするデータセットがあります。

2010/11/11 22:00 --> 22
2010/11/11 23:00 --> 12 2010/11/12
00:00 --> 18
2010/11/12 01:00 --> 19
11/ 2010 年 12 月 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し、質問で提供されたデータを入力します。スクリーンショット # 1を参照してください。テーブルの作成スクリプトは、SQL スクリプトセクションにあります。

  2. テーブル内の日付の最小値と最大値を取得し dbo.TimeScaleData、指定された範囲内のすべての時間値を生成する CTE を作成します。次にOUTER APPLY、CTE とテーブルの間で使用dbo.TimeScaleDataしてデータをフェッチします。一致するレコードがない時間範囲には、値 0 が割り当てられます。スクリーンショット # 2を参照してください。このクエリは、SSRS レポートでデータセットを作成するために使用されます。クエリは、SSRS DataSet クエリセクションで提供されます。

  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 に答える