2013-09-29 6 views
5

ループの使用方法を知りたいときは、SQLのグループごとに開始日と終了日に基づいて値ゼロで日付を記入する方法を知りたいので、各グループ。私には2つの質問があります。sqlのテーブル内のグループで不足している日付をグループで埋める方法

  1. 各グループのループ方法は?
  2. 不足している日付を動的に埋め込むために、各グループの開始日/終了日を使用する方法は?

私の入力と予想される出力は以下の通りです。

入力:

date  value  grp_no 
8/06/12 1   1 
8/08/12 1   1 
8/09/12 0   1 
8/07/12 2   2 
8/08/12 1   2 
8/12/12 3   2 

はまた、私は行方不明の日付を記入すると参加を左に使用することができ、テーブルBを持っているように、私はテーブルAを持っています。

date 
... 
8/05/12 
8/06/12 
8/07/12 
8/08/12 
8/09/12 
8/10/12 
8/11/12 
8/12/12 
8/13/12 
... 

AとBを使用して、sqlで次の出力を生成するにはどうすればよいですか?

出力:

date  value  grp_no 
8/06/12 1   1 
8/07/12 0   1 
8/08/12 1   1 
8/09/12 0   1 
8/07/12 2   2 
8/08/12 1   2 
8/09/12 0   2 
8/10/12 0   2 
8/11/12 0   2 
8/12/12 3   2 

私にあなたのコードや提案を送ってください。あまりにも先にありがとう!

+0

Bの列は何ですか? – mhn

+0

2012年に連続した日付の列のみが表示されます。 – user2824423

+1

使用しているデータベースシステムとバージョンは何ですか? –

答えて

6

あなたがループ

SELECT p.date, COALESCE(a.value, 0) value, p.grp_no 
    FROM 
(
    SELECT grp_no, date 
    FROM 
    (
    SELECT grp_no, MIN(date) min_date, MAX(date) max_date 
     FROM tableA 
    GROUP BY grp_no 
) q CROSS JOIN tableb b 
    WHERE b.date BETWEEN q.min_date AND q.max_date 
) p LEFT JOIN TableA a 
    ON p.grp_no = a.grp_no 
    AND p.date = a.date 

最も内側のサブクエリのグラブの最小値と最大値は、グループごとにさかのぼることなく、このようにそれを行うことができます。 TableBでクロス結合すると、グループごとの最小最大範囲内のすべての可能な日付が生成されます。最後に、外側の選択はTableAの外部結合を使用し、に欠落している日付の場合は0value列を埋め込みます。

出力:ここ

 
|  DATE | VALUE | GRP_NO | 
|------------|-------|--------| 
| 2012-08-06 |  1 |  1 | 
| 2012-08-07 |  0 |  1 | 
| 2012-08-08 |  1 |  1 | 
| 2012-08-09 |  0 |  1 | 
| 2012-08-07 |  2 |  2 | 
| 2012-08-08 |  1 |  2 | 
| 2012-08-09 |  0 |  2 | 
| 2012-08-10 |  0 |  2 | 
| 2012-08-11 |  0 |  2 | 
| 2012-08-12 |  3 |  2 | 

があるSQLFiddleデモ

+0

ありがとう!私は今日試してみると、それが動作するかどうかをお知らせします! – user2824423

+1

これは完璧に動作します!どうもありがとうございます。 – user2824423

+0

@ user2824423大歓迎です。幸運:) – peterm

関連する問題