
アクセス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を探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
データベースファイル(.db)を開...
-
シートが異なるセル同士を、相...
-
accsessで顧客コードで氏名を呼...
-
Accessを開きなおすとテキスト...
-
どうすれば 拡張子 を写真のよ...
-
将棋のDB。「この局面と同一の...
-
.flex-direction プロパティは...
-
汎用カード型のデータベースソ...
-
データベースがちゃんと作成さ...
-
CSVファイルでテキストの改行の...
-
構文エラー:演算子がありませ...
-
FileMaker Proに近い無料のWeb...
-
半角ハイフンに似た文字
-
データベースの勉強 公務員を目...
-
はじめてのAccess 2019 について
-
DBエラーを解決したい
-
ITパスポートについての質問で...
-
マイクロソフトAccessでsqlのas...
-
情報整理するのに、「 Fullfree...
-
レコード数のカウント
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Accessで別テーブルの値をフォ...
-
最新の日付とその金額をクエリ...
-
Accessで日付が変わると番号が...
-
access 自動採番 年が変わる...
-
SELECT * FROM `生徒名簿` INNE...
-
vba 直前の操作はキャンセルさ...
-
accessのテーブルから条件の抽...
-
sqlで質問です。 Aテーブルの登...
-
〜のような結果を出すためのSQL...
-
社員DBを作る
-
条件をつけて日付の古い行を抜...
-
Accessでのレコード存在チェック
-
【アクセスVBA】テーブルにフィ...
-
【SQL】existsでの商演算
-
質問です。 下記のテーブルとデ...
-
主キーの選び方
-
access 自動採番 「10-AA-000...
-
Access 文字+年ごとの自動採番
-
Access VBAで更新履歴を追いたい
-
MySQLで桁あふれを防ぐ方法
おすすめ情報