キー複数レコード抽出の方法とは?

このQ&Aのポイント
  • キー複数レコード抽出とは、一つのIDに対して複数のレコードを集約して抽出する方法のことです。
  • 例えば、IDが1の場合には、200804から200903までの日付に対して0のCNTを設定したレコードを作成し、それ以外のレコードは元のデータを保持します。
  • このようにして、特定のキーに対して複数のレコードを持つデータを一つのキーにまとめることができます。
回答を見る
  • ベストアンサー

1キー複数レコード抽出

今現在 ID | DATE | CNT  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄  1 | 200812 | 2  1 | 200901 | 5  2 | 200812 | 1 というデータがあったとします。 これを下記のように1つのIDに対して12のレコードを抽出することは可能でしょうか? ID | DATE | CNT  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄  1 | 200804 | 0  1 | 200805 | 0  1 | 200806 | 0  1 | 200807 | 0  1 | 200808 | 0  1 | 200809 | 0  1 | 200810 | 0  1 | 200811 | 0  1 | 200812 | 2  1 | 200901 | 5  1 | 200902 | 0  1 | 200903 | 0  2 | 200804 | 0  2 | 200805 | 0  2 | 200806 | 0  2 | 200807 | 0  2 | 200808 | 0  2 | 200809 | 0  2 | 200810 | 0  2 | 200811 | 0  2 | 200812 | 1  2 | 200901 | 0  2 | 200902 | 0  2 | 200903 | 0 よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • jamshid6
  • ベストアンサー率88% (591/669)
回答No.1

1クエリで実現する場合、残念ながら期間は汎用的にはつくれませんが、以下のクエリで可能です。 (ご覧の通り、年部分はあらかじめ固定にする必要があります) SELECT i.ID, (y.YYYY+m.MM) DATE, ISNULL(t.CNT,0) CNT FROM (SELECT '2008' YYYY UNION ALL SELECT '2009') y CROSS JOIN (SELECT '01' MM UNION ALL SELECT '02' MM UNION ALL SELECT '03' MM UNION ALL SELECT '04' MM UNION ALL SELECT '05' MM UNION ALL SELECT '06' MM UNION ALL SELECT '07' MM UNION ALL SELECT '08' MM UNION ALL SELECT '09' MM UNION ALL SELECT '10' MM UNION ALL SELECT '11' MM UNION ALL SELECT '12' MM) m CROSS JOIN (SELECT DISTINCT ID FROM TBLA) i LEFT OUTER JOIN TBLA t ON i.ID=t.ID AND t.DATE=(y.YYYY+m.MM) WHERE (y.YYYY+m.MM) BETWEEN '200804' AND '200903' 純粋にデータの中身により増幅する汎用的なものにするためには、以下のいずれかが必要です。 ・'1980'~'2050'など、あらかじめ十分な期間の年数を保持した年テーブルを準備する  (単なる1~100などの番号テーブルでも可) ・Transact-SQLを利用する 前者の場合は、そのままyの部分置き換えてやればよいですし、後者の場合は年テーブルを テーブル変数として生成する処理を先に実行します。

aleister
質問者

お礼

ありがとうございます なんとかできそうです

関連するQ&A

  • あるIDごとの最高値のレコード抽出について

    下記のようなテーブルがあるとします。 それぞれの人の最高得点であるレコードを抽出したいのですが可能でしょうか。 テーブル:result no id point date -------------------- 1 A 60 ... 2 A 70 3 B 50 4 B 90 期待出力 no id point date ------------------- 2 A 70 ... 4 B 90 自分でも色々考えたつもりですが、例えば select max(point) from result group by id; とすると 70,90 という値は抽出されますが、該当レコードの全カラムを出力させたいです。 もし同じidで同じpointのレコードがあった場合は、dateの新しいほうを優先したいです。 id,point,dateがまったく同じレコードは存在しないと仮定します。 この他にもdistinct等も考えましたが、指定したカラムが重複した場合どのレコードが選択されるかは 不定のようですので使えそうにありません。 そもそもSQLだけでこのような出力が可能かどうかもわかりません…。 テーブルの設計が悪いというのもあるのでしょうか。 どなたかご助言くだされば幸いです。

  • あるカラムの値を複数持つレコード以外を抽出したい

    下記のようなレコードを持つテーブル(仮にtest1)があります。 ID price type 001 2000 1 001 4000 1 002 8000 2 003 2000 1 003 8000 2 004 5000 3 ここから次の条件で抽出したいのですがSQLに明るくないためよくわかりません。 ・typeが1と2の両方を持つもの、または、3を持つものを除く ・その上でpriceの合計値をIDごとに得たい 求める結果としては、 ID price 001 6000 002 8000 を得たいのですが。 distinctを使う必要があるというぐらいしか分かっていません。 よろしくお願いします。

  • 2つの条件を満たすのレコードのカラムを抽出する方法について

    下記のテーブルがあったとします。 【t_tblテーブル】 ――――――――――――― |id1  |id2 |id3  | ――――――――――――― |1   |1  |10   | |1   |2  |12   | |1   |3  |9   | |1   |4  |8   | |1   |5  |14   | |2   |1  |14   | |2   |2  |8   | |2   |3  |9   | |2   |4  |12   | |2   |5  |10   | |3   |1  |4   | |3   |2  |2   | |3   |3  |3   | |3   |4  |5   | |3   |5  |6   | |4   |1  |6   | |4   |2  |5   | |4   |3  |3   | |4   |4  |2   | |4   |5  |4   | ――――――――――――― このテーブルの特定のレコードを抽出する為に、 2つパラメータを渡すとします。 1. 12 2. 8 そして下記の条件を満たすレコードのid1を抽出したいと思います。 1. 「id3」 = 「12」 かつ 「id3」 = 「8」 を満たすid1 (※この時点で1と2がヒットします) 2. 条件1を満たした上で、「12」のid2 < 「8」のid2 (※この時点で1のみヒットします) 下記のSQLで条件1を満たせる事は確認しましたが、 条件2を満たす方法が分かりませんでしたので、 アドバイスいただける方がいらっしゃいましたら、 ご教示いただきたいと思います。 select id1 from t_tbl group by id1 Having SUM(CASE WHEN id3=12 Then 1 Else 0 End)>0 And SUM(CASE WHEN id3=8 Then 1 Else 0 End)>0 使用バージョンは7.4.19です。 よろしくお願いします。

  • ACCESS2000でのレコード抽出

    OS:WindowsXP ACCESS2000 あるフィールドの値が最大となるようなレコードを選択クエリで 抽出しようとしているのですがうまくいきません。 テーブルのフィールドは4個あります。 テーブル [系列] [優先度] [データ1] [データ2] ここで各系列ごとに優先度が最大となるレコードのみを 抽出したいのです。 系列、データ1、データ2は重複がありえます。 優先度は系列を跨いだ重複はありますが、 同系列内での重複はありません。 レコードの例) 1:系列A 優先度1 データA データB 2:系列A 優先度2 データC データD 3:系列B 優先度1 データE データF 上記の例で言いますと、レコード2:とレコード3:のみを 抽出するクエリを作成したいのです。 集計クエリで優先度のフィールドを「最大」にしても、 3つのデータ全てが抽出されてしまいます。 どなたか解決策をご教示ください。

  • 【Access2000】レコードの抽出方法

     Access2000を使用してデータベースを作成していますが、抽出条件でつまずいています。  具体的には、  【1】選択クエリーAを基に作成したフォームA(単票形式でレコードを1件ずつ表示)があります。  【2】フォームAの中に単票形式でレポートを出力するマクロボタンが有。  【3】現在はマクロボタンを押すとパラメータで「データNo.?」と入力してもらう形になってレコードを1件抽出する形になっています。    ※画面上に表示されている「データNo.」フィールドの数値を入力してもらう形です。  質問についてですが、今のところはパラメータを入力してもらいレコードを抽出→レポートを出力していますが、パラメータを使わず、現在、フォーム上に表示されているレコード(表示されている1件)を抽出する方法はないかと壁にぶち当たっています。  言い換えれば、レポートを出力する際の元になるクエリの抽出条件で「現在、表示されているレコード」をどのように記述すればいいか、もし御存知の方がいらっしゃいましたら御教示お願いいたします。

  • ある条件を持たないレコードの抽出

    下記のようなデータがあります。 col1 col2 ========== 001 AAA 001 BBB 001 CCC 002 AAA 002 CCC 003 BBB 003 CCC 004 AAA col2 にBBB を持たないレコードを抽出したいのですが どのようにSQLを記述すればよいかご教授ください。 得たい結果 002 004 どうぞよろしくお願いいたします。

  • 二つのハテナを含むレコード(「??」)のみ抽出させ

    二つのハテナを含むレコード(「??」)のみ抽出させるには? レコードには、 あ?? い? う が入っていて、「??」がある、レコードのみ抽出したいのですが [??]を含む と言う条件で検索すると、 ハテナが一つでも含まれるレコードも検索されてしまいます。 要するに結果は あ?? い? が抽出されるということです。 このような場合、 あ?? のみ、抽出させるにはどうすればいいでしょうか?

  • 期間内のデータ抽出

    テーブル名:HOGE ID  DATE1     DATE2     FLG ------------------------------------------------------------ 001  2012-07-01  2012-07-15  0 002  2012-07-10  2012-07-20  0 003  2012-07-01  2012-08-01  0 004  2012-07-05  2012-07-19  1 005  2012-07-20  2012-07-31  0 006  2012-07-07  2012-07-15  0 で、本日の日付(2012年7月9日)がDATE1~DATE2に入る、かつFLGが0のレコードだけ抽出したいです。 上記の場合、 ID 001 003 006 この様に抽出したいのですが、宜しくお願い致します。

  • accessで複数条件でレコード抽出

    選択クエリにLike~で始まる条件1から条件6までを設定し、抽出フォームを作りましたが、全レコードの中から抽出されません。条件に該当するレコードが何件か抽出されないのです。どうすればいいでしょうか

  • 新規レコードから抽出されない。

    アクセス2007で簡単な名簿を作成しています。 テーブルは1個 レコードの内容は、名前、郵便番号、住所1、住所2,会社名、会社郵便番号、会社住所1,会社住所2,入力日、個人・職場 となっています。 フォーム 入力と閲覧を兼ねたフォームを1個作成しています。 クエリー 選択クエリーを2個作っています。 【選択クエリー個人】はレコード「個人」を抽出条件を「個人」としています。 【選択クエリー職場】はレコード「職場」を抽出条件を「職場」としています。 クエリーでは、登録が個人か職場を選択出来るようにしています。 テーブルには、手元にあったエクセルのデータ(xlsx)を読み込ませました。 この時点では、【選択クエリー個人】【選択クエリー職場】どちらのクエリーでも希望通りのデータが抽出出来ました。 実際の運用を初めフォームから入力を始めた所、新規に入力したデータが【選択クエリー個人】【選択クエリー職場】個々のクエリーで抽出されない事に気がつきました。 確認した事 テーブルを確認した所、データは全てテーブルに入力されている。 テーブルで「個人・職場」の列でフィルタを掛けると、新規入力分が抽出されない。 なぜ抽出されないかを知りたい。 入力フォームにて 「個人・職場」の部分はコンボボックスにしています。 テーブルにて 入力フォームを利用せず、テーブルに直接データを入力してもフィルタで抽出されません。 対策 テーブルの内容をいったん全てを「テキスト」でエクスポートしました。 エクスポートしたデータには、フォームから入力したデータも含まれています。 テーブルをコピーして、貼り付けの際「テーブルの構造みの」として新規テーブルを作成。 新規作成したテーブルにエクスポートした「テキスト」データを読み込み。 エクスポートしたテーブルは削除し新規作成したテーブルを同じ名称に変更した。 上記対策を行った後フォームから新規データ入力後、テーブルのフィルタで抽出されるようになり、クエリーで抽出されるようになりました。旧テーブルの時に入力したデータも抽出されます。 アクセスにデータをインポートする際にエクセルのデータとテキストでは違い有るのでしょうか。 上記の対策を行いましたが、この状態で運用して問題ないでしょうか。 同じような経験された方がおればアドバイス頂ければ嬉しく思います。