SQL(SQL Server)で日付を持ったデータの集計をしています。
開始日時と終了日時を持ったデータに対し、1ヶ月分、23時59分59秒に、
開始されていて終了されていないデータの件数を一覧にしたいのですが
うまい方法が思いつきません。
データはごく簡単に書くと以下のようなテーブルです。
CREATE TABLE hoge ( ID int PRIMARY KEY, 開始日時 datetime2(0), 終了日時 datetime2(0), --終了していない場合はNULL )
1日分を持ってくるのは以下のような感じで考えています。
SQL
1DECLARE @対象日時 datetime2(0) 2 SET @対象日時 = '2016-07-22 23:59:59' 3 4SELECT COUNT(*) AS 数 5 FROM hoge 6 WHERE 開始日時 <= @対象日時 7 AND (終了日時 < @対象日時 OR 終了日時 IS NULL)
日付マスタのようなものはあるので、そこで1ヶ月分の日付のリストを作成し、LEFT OUTER JOIN させるようなことを考えています。
ループさせるのではなくSQLで解決させるにはどうすればよいでしょうか?
どのような結果が欲しいか追記します。
たとえば、下記のようなレコードがあった場合
ID,開始日時,終了日時 1,"2016-04-02 01:00:00","2016-04-05 01:00:00" 2,"2016-04-04 01:00:00",NULL
結果としては
日付,件数 "2016-04-01", 0 //1件もない "2016-04-02", 1 //1のデータのみ "2016-04-03", 1 //1のデータのみ "2016-04-04", 2 //1と2のデータ "2016-04-05", 1 //1のデータは23:59:59には終了していて2のデータのみ "2016-04-06", 1 //2のデータのみ
といった感じになります。日付のところは、上記の例だと
SQL
1SELECT 日付 FROM 日付マスタ WHERE 日付 BETWEEN '2016-04-01' AND '2016-04-06'
というように取り出せます。
わかりにくくて申し訳ありませんがよろしくお願いいたします。
回答7件
あなたの回答
tips
プレビュー