- ベストアンサー
アクセスでのレコード移動の方法と注意点|アクセス2010でのデータ移動について
- アクセス2010でのレコード移動の方法について質問があります。具体的には、データを一定の条件で移動したい場合のクエリや方法について知りたいです。
- 例えば、アクセスデータベースに以下のようなレコードが存在しているとします。 00001,郵便番号,住所,氏名,TEL 00002,郵便番号,住所,氏名,TEL 00003,郵便番号,住所,氏名,TEL 00004,郵便番号,住所,氏名,TEL 00005,郵便番号,住所,氏名,TEL 00006,郵便番号,住所,氏名,TEL 00007,郵便番号,住所,氏名,TEL 00008,郵便番号,住所,氏名,TEL 00009,郵便番号,住所,氏名,TEL このデータを特定のルールに基づいて移動したい場合、どのような方法を使用すれば良いでしょうか?詳しいアドバイスをお願いします。
- アクセス2010のレコード移動についての質問です。例えば、9つのレコードを3つのグループに分割したいと思っています。つまり、元のデータ00001〜00009を次のように分けたいです。 00001,郵便番号,住所,氏名,TEL,00004,郵便番号,住所,氏名,TEL,00007,郵便番号,住所,氏名,TEL 00002,郵便番号,住所,氏名,TEL,00005,郵便番号,住所,氏名,TEL,00008,郵便番号,住所,氏名,TEL 00003,郵便番号,住所,氏名,TEL,00006,郵便番号,住所,氏名,TEL,00009,郵便番号,住所,氏名,TEL アクセス2010でこのようなデータ移動は可能でしょうか?アドバイスをお願いします。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
可能です。 理論を組み立てます。 (1)レコードの順位付けを行う。→クエリQ (2)上記のQを第1列用、第2列用、第3列用として結合する。 (3)第1列用は順位を3で割った剰余が0のものを抽出する。 (4)第2列用は順位が第1列用の順位+1のものを結合する。 (5)第3列用は順位が第1列用の順位+2のものを結合する。 元のテーブルをT、第1列目をSEQと仮定すると、以下のように SQLを構築します。 (1)クエリQのSQL SELECT A.SEQ ,MAX(A.郵便番号) AS 郵便番号 ,MAX(A.住所) AS 住所 ,MAX(A.氏名) AS 氏名 ,MAX(A.TEL) AS TEL ,COUNT(B.SEQ) AS 順位 ←★ FROM T AS A LEFT JOIN T AS B ON A.SEQ > B.SEQ ←★ GROUP BY A.SEQ ★同じテーブル同士で、自分よりキーの小さいものの数を 数えます。先頭レコードから0、1、2…となります。 (2)目的のクエリ SELECT A.SEQ ,A.郵便番号 ,A.住所 ,A.氏名 ,A.TEL ,B.SEQ ,B.郵便番号 ,B.住所 ,B.氏名 ,B.TEL ,C.SEQ ,C.郵便番号 ,C.住所 ,C.氏名 ,C.TEL FROM (Q AS A LEFT JOIN Q AS B ON A.順位 = B.順位 - 1) ←★1 LEFT JOIN Q AS C ON A.順位 = C.順位 - 2 ←★2 WHERE (A.順位 MOD 3)=0 ←★3 ★1 Aの順位が0の時にBの順位が1のものと結合します。 ★2 Aの順位が0の時にCの順位が2のものと結合します。 ★3 Aの順位を3で割った時の剰余が0のものを抽出します。 いずれも不等号の結合条件なので、クエリビルダでは 作成できず、SQLビューでの直接入力になります。
その他の回答 (1)
- 30246kiku
- ベストアンサー率73% (370/504)
> データを移動・・・レコード移動・・・ という言葉が出てきていますが、表示上の事と解釈して良かったでしょうか 提示された5桁の数字部分のフィールド名を「番号」、テーブル名を「★★」と仮定します。 9レコードを3×3の表示・・・これに限定したとすれば、以下でできそう SELECT Q1.*, Q2.*, Q3.* FROM ( (SELECT (Int(番号)-1)\3 AS S, (Int(番号)-1) Mod 3 AS M, * FROM ★★) AS Q1 INNER JOIN (SELECT (Int(番号)-1)\3 AS S, (Int(番号)-1) Mod 3 AS M, * FROM ★★) AS Q2 ON Q1.S+1=Q2.S AND Q1.M=Q2.M) INNER JOIN (SELECT (Int(番号)-1)\3 AS S, (Int(番号)-1) Mod 3 AS M, * FROM ★★) AS Q3 ON Q2.S+1=Q3.S AND Q2.M=Q3.M ORDER BY Q1.M; S は、番号を元に、何組目の表示になるのか M は、番号を元に、何レコード目の表示になるのか 表示レコードは、M が同じで 隣の S は 左側の S+1 になっている 9レコード限定なので INNER JOIN で結び付け 番号 「00001」の隣は「00004」で、その隣は「00007」 番号 「00002」の隣は「00005」で、その隣は「00008」 番号 「00003」の隣は「00006」で、その隣は「00009」 番号 「00004」の隣は「00007」で、その隣は・・・ないので INNER JOIN により抽出外 横3組は変えずに表示行を変更できるようにすれば、以下の様な感じで (実行すると「行数」の入力になるので、4 とか 5 とか入力すれば・・・) SELECT Q1.*, Q2.*, Q3.* FROM ( (SELECT (Int(番号)-1)\[行数] AS S, (Int(番号)-1) Mod [行数] AS M, * FROM ★★) AS Q1 LEFT JOIN (SELECT (Int(番号)-1)\[行数] AS S, (Int(番号)-1) Mod [行数] AS M, * FROM ★★) AS Q2 ON Q1.S+1=Q2.S AND Q1.M=Q2.M) LEFT JOIN (SELECT (Int(番号)-1)\[行数] AS S, (Int(番号)-1) Mod [行数] AS M, * FROM ★★) AS Q3 ON Q2.S+1=Q3.S AND Q2.M=Q3.M WHERE Q1.S=0 ORDER BY Q1.M; ※ 計算用に追加したフィールド「S」「M」は適当にあしらってください また、別の方法(クロス集計)を使って横5組限定としてみると以下の様な雰囲気に PARAMETERS [行数] Long; TRANSFORM First(Q1.値) AS 値 SELECT (Int(Q1.番号)-1) Mod [行数] AS 順 FROM (SELECT 番号, "番号" AS 項目, 番号 AS 値 FROM ★★ UNION ALL SELECT 番号, "郵便番号", 郵便番号 FROM ★★ UNION ALL SELECT 番号, "住所", 住所 FROM ★★ UNION ALL SELECT 番号, "氏名", 氏名 FROM ★★ UNION ALL SELECT 番号, "TEL", TEL FROM ★★) AS Q1 GROUP BY (Int(Q1.番号)-1) Mod [行数] PIVOT 項目 & (((Int(Q1.番号)-1)\[行数])+1) IN ('番号1','郵便番号1','住所1','氏名1','TEL1', '番号2','郵便番号2','住所2','氏名2','TEL2', '番号3','郵便番号3','住所3','氏名3','TEL3', '番号4','郵便番号4','住所4','氏名4','TEL4', '番号5','郵便番号5','住所5','氏名5','TEL5'); ※ クロス集計では、PIVOT 部分で IN 指定(列見出し指定)しないと、 TEL1,TEL2,氏名1,氏名2,住所1,住所2,・・・の様に、組として表示してくれない ※ 各フィールドの値を1つのものとして扱うので数値型があったとしても、ここではテキストに なお、上記クロス集計で5組を有効に使ってみると(行数はレコード数によって可変) TRANSFORM First(Q1.値) AS 値 SELECT (Int(Q1.番号)-1) Mod ((Q2.CT+4)\5) AS 順 FROM (SELECT 番号, "番号" AS 項目, 番号 AS 値 FROM ★★ UNION ALL SELECT 番号, "郵便番号", 郵便番号 FROM ★★ UNION ALL SELECT 番号, "住所", 住所 FROM ★★ UNION ALL SELECT 番号, "氏名", 氏名 FROM ★★ UNION ALL SELECT 番号, "TEL", TEL FROM ★★) AS Q1, (SELECT Count(*) AS CT FROM ★★) AS Q2 GROUP BY (Int(Q1.番号)-1) Mod ((Q2.CT+4)\5) PIVOT 項目 & (((Int(Q1.番号)-1)\((Q2.CT+4)\5))+1) IN ('番号1','郵便番号1','住所1','氏名1','TEL1', '番号2','郵便番号2','住所2','氏名2','TEL2', '番号3','郵便番号3','住所3','氏名3','TEL3', '番号4','郵便番号4','住所4','氏名4','TEL4', '番号5','郵便番号5','住所5','氏名5','TEL5'); ※ Q2 でレコード数を求めておいて、前述の [行数] 部分を ((Q2.CT+4)\5) に置き換えます ただし現状では、5組目が使われない事があります。 これは、左の組から行分データを詰めるので・・・ 10レコードなら2行で5組目まで使われますが、 11レコードなら3行で、3組目までは埋まって、4組目は2つの計11 3行では、13レコードになって初めて5組目が使われる事になります。 ※ なお、データ量によって組数(フィールド側)も可変にしたい場合は、 VBA で SQL を組み立てる事になると思います。 ※ 各処理性能はわかりません
お礼
どうもありがとうございます。 今回は、たまたま例題を上げて ご質問させて頂きましたので 内容によっては、3つにしたり 2つにしたり変わってきます。 サンプルを参考にさせていただきながら 別にVBA等で作業してみます。 どうもありがとうございました。
お礼
ありがとうございました。 この説明方法で 組み立ててみます。 ご丁寧にどうも ありがとうございました。