アクセス2010でご質問がございます。
00001,郵便番号,住所,氏名,TEL
00002,郵便番号,住所,氏名,TEL
00003,郵便番号,住所,氏名,TEL
00004,郵便番号,住所,氏名,TEL
00005,郵便番号,住所,氏名,TEL
00006,郵便番号,住所,氏名,TEL
00007,郵便番号,住所,氏名,TEL
00008,郵便番号,住所,氏名,TEL
00009,郵便番号,住所,氏名,TEL
のようなデータが存在したとします。
下記のようにデータを移動したいのですが
00001,郵便番号,住所,氏名,TEL,00004,郵便番号,住所,氏名,TEL,00007,郵便番号,住所,氏名,TEL
00002,郵便番号,住所,氏名,TEL,00005,郵便番号,住所,氏名,TEL,00008,郵便番号,住所,氏名,TEL
00003,郵便番号,住所,氏名,TEL,00006,郵便番号,住所,氏名,TEL,00009,郵便番号,住所,氏名,TEL
クエリ等で、レコード移動は可能なのでしょうか??
※今回の例ですと全9レコードありますので3等分にしたいので
9÷3で3レコードになります。
アドバイス宜しくお願い致します。
No.1ベストアンサー
- 回答日時:
可能です。
理論を組み立てます。
(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ビューでの直接入力になります。
No.2
- 回答日時:
> データを移動・・・レコード移動・・・
という言葉が出てきていますが、表示上の事と解釈して良かったでしょうか
提示された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等で作業してみます。
どうもありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
[Access]異なるレコード間の文...
-
サイベースには、オラクルのROW...
-
Accessで別テーブルの値をフォ...
-
最新の日付とその金額をクエリ...
-
アクセスで「空き番」の確認
-
【Access】選択クエリのグルー...
-
Access VBAで更新履歴を追いたい
-
コンボボックスの使い方
-
【SQL】existsでの商演算
-
GROUP BYを行った後に結合した...
-
select insertで複数テーブルか...
-
Oracleでの文字列連結サイズの上限
-
実績累計の求め方と意味を教え...
-
SQL 外部結合についての質問
-
select句副問い合わせ 値の個...
-
日本語の表名、列名の利用について
-
GROUP BYを使ったSELECT文の総...
-
OracleのSQL*PLUSで、デー...
-
エクセルデータの末尾の改行を...
-
ADO接続からのACCESSデータシー...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Accessで別テーブルの値をフォ...
-
最新の日付とその金額をクエリ...
-
Accessでのレコード存在チェック
-
Accessで日付が変わると番号が...
-
access 自動採番 「10-AA-000...
-
access 自動採番 年が変わる...
-
Access 文字+年ごとの自動採番
-
【アクセスVBA】テーブルにフィ...
-
条件をつけて日付の古い行を抜...
-
Access:抽出して、色をつけたい。
-
[Access]異なるレコード間の文...
-
vba 直前の操作はキャンセルさ...
-
アクセスで「空き番」の確認
-
【Access】選択クエリのグルー...
-
【SQL】existsでの商演算
-
Recordset.FindFirstについて
-
ACCESSのVBAについて
-
access 請求番号の自動採番
-
Accessの色番号について
-
主キーの選び方
おすすめ情報