テニスコートの予約情報をSQLデータベースから簡単な結果テーブルに抽出して、裁判所の使用法の図を作成するのに役立ちます。それは1時間以上続く予約の場合を除いて、かなり簡単です。値に基づく単一または複数のINSERT
現時点では、各予約は結果表に1行ずつ表示されます。各行には、開始時間、期間、裁判所の番号が含まれています。この表をスプレッドシートまたはピボットテーブルに直接マップして、裁判所の裁判所の数と1日の時間帯を確認することができます。私たちの問題、すなわち、2、3時間以上の期間の予約が唯一の結果テーブルに1行を持っているということです
INSERT INTO Results (year, month, day, hour, duration, court)
SELECT DATEPART (yy, b.StartDateTime),
DATEPART (mm, b.StartDateTime),
DATEPART (dd, b.StartDateTime),
DATEPART (hh, b.StartDateTime),
a.Duration,
a.Court
FROM Bookings b
INNER JOIN Activities a
ON b.ActivityID = a.ID
:
は現在、私たちのSQLクエリは次のようになります。予約の最初の1時間。これは、予約の長さが期間データに取り込まれるためです。私たちは目的を達成するためにデータに対していくつかの後処理を行うことができますが、これがSQLクエリで可能だった場合は簡単になります。
期間(1、2、3、...時間など)に応じて、適切な数の行が結果表に挿入され、期間1したがって、9時からの3時間の予約では、結果表に3行、1つは午前9時に、1つは午前10時に、1つは午前11時に、1時間ごとに実行されます。
だからではなく、結果表に次の行を:これは、はるかに簡単にスプレッドシートに結果テーブルをマッピングするだろう
Year, Month, Day, Hour, Duration, Court
2009, 08, 25, 09, 1, 1
2009, 08, 25, 10, 1, 1
2009, 08, 25, 11, 1, 1
:
Year, Month, Day, Hour, Duration, Court
2009, 08, 25, 09, 3, 1
我々は、次の行を取得。
UPDATE 2009-08-25:もちろん、最初の2つの回答が示すとおり、1つのクエリである必要はありません。セットは大丈夫です。
UPDATE 2009-08-26:サイドトラックされており、まだ提案された解決策を試す機会がありませんでした。すぐにそうすることを希望し、結果に基づいて回答を選択します。
UPDATE 2009-08-27:最後に解決策を試す機会を得ました。整数の表と解を生成するための結合は目が離せないものでした。特にクロスジョインを使用してそのようなテーブルを作成する。これはおそらく、よりクリーンなSQLのやり方です。
しかし、結局のところ、私はフラグと単純なアルゴリズムを含むAaronのソリューションに行きました。アルゴリズムをwhileループでラップして、その継続時間が1を超えないようにするために、繰り返し処理を続けることで、この問題を改善しました。これは迅速かつ簡単に実装できました。また、私たちは約10時間の予約をしていたので、ここでは制限をハードコードする必要はありませんでした。
私は、duration> 1のアイテムを数えるという独自の考え方ではなく、whileループカウンターにmax durationのアイデアを取り入れたことに注意してください。
どのバージョンのSQL Serverですか? –
SQL Server 2000.それは違いをもたらすでしょうか? – dave
SQL 2005以降には、このようなクエリを簡単にする機能がいくつかあります。 –