激凹みから立ち直る方法

アクセス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レコードになります。

アドバイス宜しくお願い致します。

A 回答 (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ビューでの直接入力になります。
    • good
    • 0
この回答へのお礼

ありがとうございました。
この説明方法で
組み立ててみます。
ご丁寧にどうも
ありがとうございました。

お礼日時:2013/07/16 11:53

> データを移動・・・レコード移動・・・



という言葉が出てきていますが、表示上の事と解釈して良かったでしょうか

提示された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 を組み立てる事になると思います。


※ 各処理性能はわかりません
    • good
    • 0
この回答へのお礼

どうもありがとうございます。
今回は、たまたま例題を上げて
ご質問させて頂きましたので
内容によっては、3つにしたり
2つにしたり変わってきます。
サンプルを参考にさせていただきながら
別にVBA等で作業してみます。
どうもありがとうございました。

お礼日時:2013/07/16 11:57

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

関連するカテゴリからQ&Aを探す