2016-12-21 6 views
1

ユーザーは日付範囲を入力し、その範囲とその装置の同時使用数の間のすべての日付とを含むSQLに出力します。この例ではSQLを使用してユーザー入力の日付範囲内の同時実行日をカウントする

、あなたは私がこれらの日付の間、または何も含めるの下に見ることができるように、ユーザーの日付範囲は、03/08/2016 to 03/09/2016です(カテゴリ別にグループ化しますが、私は唯一の「電動車椅子」を使って、ここに簡略化されました)

テーブルのスキーマは次のとおりです。

trans_date | trans_end_date | eq_category 
17/03/2016 | 16/10/2016  | POWERCHAIR 
08/08/2016 | 08/08/2016  | POWERCHAIR 
12/08/2016 | 12/08/2016  | POWERCHAIR 
17/08/2016 | 18/08/2016  | POWERCHAIR 
22/08/2016 | 22/08/2016  | POWERCHAIR 
26/08/2016 | 26/08/2016  | POWERCHAIR 
02/09/2016 | 02/09/2016  | POWERCHAIR 

出力したいと思います。

date  | concurrent_use 
03-08-2016 | 1 
04-08-2016 | 1 
05-08-2016 | 1 
06-08-2016 | 1 
07-08-2016 | 1 
08-08-2016 | 2 
09-08-2016 | 1 
10-08-2016 | 1 
11-08-2016 | 1 
12-08-2016 | 2 
13-08-2016 | 1 
14-08-2016 | 1 
15-08-2016 | 1 
16-08-2016 | 1 
17-08-2016 | 2 
18-08-2016 | 2 
19-08-2016 | 1 
20-08-2016 | 1 
21-08-2016 | 1 
22-08-2016 | 2 
23-08-2016 | 1 
24-08-2016 | 1 
25-08-2016 | 1 
26-08-2016 | 2 
27-08-2016 | 1 
28-08-2016 | 1 
29-08-2016 | 1 
30-08-2016 | 1 
31-08-2016 | 1 
01-09-2016 | 1 
02-09-2016 | 2 
03-09-2016 | 1 

1 or 0同時にその日の任意の機器が出てきてはいけないと、私はそれから除外することができます。

私はこれがギャップ/アイランドの問題ではないと思っていますが、ステートメントでこれを取得しようとしている空白を描いています。

答えて

1

次のようにしてください。再帰的なcteを使用して日付を生成する必要があります。次に、範囲内にある各日付の出現回数をカウントする必要があります。

 ;WITH CTE 
    AS (SELECT CONVERT(DATE, '2016-08-03', 103) DATE1 
     UNION ALL 
     SELECT Dateadd(DAY, 1, DATE1) AS DATE1 
     FROM CTE 
     WHERE Dateadd(DD, 1, DATE1) <= '2016-09-03') 
SELECT C.DATE1, 
     Count(1) OCCURENCES 
FROM CTE C 
     JOIN #TABLE1 T 
     ON C.DATE1 BETWEEN [TRANS_DATE] AN [TRANS_END_DATE] 
GROUP BY C.DATE1 
+1

これは1つのように思われます。日付フィールドには1日の時刻も含まれていますが、それ以外の時刻は期待通りに機能するため、 'CAST(日付はtrans_date) 'にしてください。 – Kowalski

1

数字または日付のセットが必要です。

with d as (
     select cast('2016-08-03' as date) as d 
     union all 
     select dateadd(day, 1, d.d) 
     from d 
     where d < '2016-09-03' 
    ) 
select d.d, count(s.trans_date) 
from d left join 
    schema s 
    on d.d between s.trans_date and s.trans_date_end 
group by d.d; 

開始日と終了日の両方が範囲に含まれている場合、私はわからない:だから、あなたはその範囲内のすべてのものをしたい場合。

関連する問題