0

SQL Server 2005 データベースでストアド プロシージャを実行する Crystal Reports XI Developer でレポートを作成しています。レコード セットは、日と時間でグループ化されたログ テーブルから要約を返します。

現在、私のクエリは次のようになります。

SELECT
    sum(colA) as "Total 1", 
    day(convert(smalldatetime, convert(float, Timestamp) / 1440 - 1)) as "Date",
    datepart(hh, convert(smalldatetime, convert(float, Timestamp) / 1440 - 1)) as "Hour"
    `etc...`
GROUP BY 
    Day, Hour

日付の狂気は無視してください。システム設計者は、日付を保存する方法を考え出したときに、かなりの量を飲んでいたと思います。

私の問題は次のとおりです。1 日の各時間の記録が常にあるとは限らないため、最終的にギャップが生じますが、これは理解できますが、Crystal が 24 時間全体について報告できるようにしたいと考えています。データかどうか。

クエリ全体をWHILE(ストアド プロシージャ内で) ループに入れて、個々の時間にクエリを実行することで、これを変更できることはわかっていますが、私の中では、1 つのクエリが 24 よりも優れていると言っています。

通常のようにテーブル内の行を反復処理するのではなく、Crystal を 1 日の時間単位で反復処理させる方法があるかどうかを知りたいです。

または、データベース サーバーを強制終了せずに空の時間行が含まれるようにクエリをフォーマットする方法はありますか?

4

2 に答える 2

2

WITH 句を使用して 24 時間を作成し、それを OUTER JOIN することができます。

WITH hours AS (

  SELECT 1 AS hour
  UNION
  SELECT 2 AS hour
  ...
  SELECT 24 AS hour

)

SELECT *
FROM hours h
LEFT OUTER JOIN [your table] x ON h.hour=x.datepart(hh, convert(smalldatetime, convert(float, Timestamp) / 1440 - 1))

この SQL はコマンドに追加する必要があります。

SQL またはレポートで必要に応じてグループ化します。

于 2011-06-07T19:58:56.153 に答える
2

この問題を解決した方法は次のとおりです。

  1. SQL サーバーにローカル テーブルを作成します。「LU_Hours」と呼びます。
  2. このテーブルには、24 行の 1 つの整数フィールド (「時間」と呼ばれる) があります。もちろん、値は 1 ~ 24 です。
  3. これを既存のクエリに直接結合します。
  4. 空の時間のヌルが満足のいくように処理されるようにするには、これを微調整する必要がある場合があります。
于 2011-06-07T19:08:05.177 に答える