質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Access

Accessはマイクロソフトによるリレーショナルデータベース管理システムです。オブジェクト指向のアプリケーション作成に対応しており、テーブルや編集をはじめ、クエリ生成、入力フォーム作成、レポート作成など一通りの機能を備えています。

Q&A

解決済

2回答

29879閲覧

Access 単純に表テーブルの縦横(行列)の変換(入れ替え)を行いたい。

0_0

総合スコア1

Access

Accessはマイクロソフトによるリレーショナルデータベース管理システムです。オブジェクト指向のアプリケーション作成に対応しており、テーブルや編集をはじめ、クエリ生成、入力フォーム作成、レポート作成など一通りの機能を備えています。

0グッド

0クリップ

投稿2020/06/19 03:35

編集2020/06/19 05:12

お世話になります。 Access365にて開発中です。
添付図のように単純に表テーブルの縦横(行列)の変換(入れ替え)を行いたいのですが
(特に集計もありません) どう処理してよいのか模索しています。 クロス集計/ユニオンクエリ/
TRANSFORM・・・ とそれらしいキーワードは見つかるのですが、これという方法をどなたかご教示お願いします。

イメージ説明

以上、よろしくお願い致します。

情報追記:添付のテーブルデータとその構造です。

1_りんご 2_みかん 3_とまと 4_めろん 5_いちご

06/01 10 7 12 0 16
06/02 8 9 15 2 14
06/03 13 10 12 5 20
06/04 11 6 16 8 21
06/05 7 6 5 0 15
06/06 5 8 5 1 11

イメージ説明

以上

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

そもそも論ですか、データベースとしてはどちらの表もNGです。データベースとしては使い物になりません。

下記のようなテーブル設計にしておくべきです。(本当なら商品マスタテーブルも必要になりますが、これは今回はスルーしておきます。)

日付商品名数量
6月1日りんご10
6月1日みかん7
6月1日とまと12
6月1日めろん0
6月2日りんご8
6月2日みかん9
6月2日とまと15
6月2日めろん2

このようなテーブルなら、クロス集計クエリウィザードで、図のどちらの表にも簡単に変換できます。

Accessでクロス集計クエリを作成する方法 | できるネット

もし、図の表データが外部データをインポートしたものなら、ユニオンクエリで上記の形に変換してテーブル作成クエリでテーブルを作成して使用するようにします。

投稿2020/06/19 04:46

hatena19

総合スコア34075

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0_0

2020/06/19 05:48

コメント誠にありがとうございます。 確かにご指摘の通り商品名としての要素が列名になっているのはDBとしてはNGと言えるでしょうか。 前段の集計処理などした結果、最終的に期待するフォーマットと縦横入れ替わった表が出力されたので 技術的に行列入れ替えが可能なのかどうかということで、今回質問させて頂いております。 コメントに書かれた内容も参考にさせて頂き再考してみます。
guest

0

ベストアンサー

ExcelのTRANSPOSE関数みたいな事をやりたいのですよね。

単に出力だけならExcelに出力して、TRANSPOSEするような処理を行えば良いと思います。
【Excel,Access】ExcelとAccess間でのRecordSetの取り扱いが面倒だった

Accessのみで行うなら、ユニオンクエリーで、(行の項目, 列の項目、値)という形に整形したものを、クロス集計すれば良いかと思います。

追記

先ずユニオンクエリーで正規化します。これを「クエリ1」とします。

SQL

1select 日時, '1_リンゴ' as 項目, [1_リンゴ] asfrom T_売上 2union all 3select 日時, '2_みかん', [2_みかん] from T_売上 4union all 5select 日時, '3_とまと', [3_とまと] from T_売上 6union all 7select 日時, '4_めろん', [4_めろん] from T_売上 8union all 9select 日時, '5_いちご', [5_いちご] from T_売上

上記「クエリ1」を元にクロス集計します。

SQL

1TRANSFORM Sum() 2SELECT 項目 3FROM クエリ1 4GROUP BY 項目 5PIVOT 日時

投稿2020/06/19 03:59

編集2020/06/19 06:33
sazi

総合スコア25327

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0_0

2020/06/19 04:30

ご回答誠にありがとうございます。 後に連動する処理があるのでAccessの中で完了させたいです。 お手数ですが実際のユニオンクエリーによる成型の表記について サンプル頂けると有難いのですが、ご検討の程よろしくお願いいたします。
sazi

2020/06/19 04:40 編集

ではテーブルの定義とデータサンプル(画像では無く)を質問に追加して下さい ただ、後続で連動する処理はどのように考えていますか? クロス集計の列を固定にするなら別ですけど、そうでないなら後続の処理は可変の列に対応しないと駄目になりますよ? 後続を考えるなら、クロス集計の結果ではなく、ユニオンクエリーで整形されたものに対して行った方が良いと思います。
sazi

2020/06/19 04:49

もっと言うなら、質問の元の表に対して処理があるなら、扱いずらい状態になっていると思われます。 正規化したテーブルを用意して移し替える事をお薦めします。 その表が外部から取り込まれるものであるなら変換処理を作成する必要があるでしょうが、Fieldsコレクションを参照すれば可変にも対応できるはずです。
0_0

2020/06/19 05:15

コメントありがとうございます。 質問を編集してみました。 後続処理の件ですが、Accessの中の処理としてはこの表(縦横変換した表)で完了予定です。 クロス集計の列も取り合えず(頻繁には変更しないので)固定を考えていますがあまり良くないのかも しれません。 以上、よろしくお願いいたします。
sazi

2020/06/19 05:40 編集

ユニオンクエリーは列が変わると、修正が発生します。 正規化されていない状態ですから、くれぐれも安直に考えないようにして下さい。
sazi

2020/06/19 06:08

集計はMin()からSum()に変更しました。その方が無難そうなので。
0_0

2020/06/19 06:24

サンプルコードありがとうございます。 再現できました、Excellent!!です。 ご指摘の通り列名変更での修正が多々発生してしまいますので前段の処理を検討して 正規化データとして扱えるように考えてみます。 お時間割いて頂き誠にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問