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

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

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

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Access

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

Q&A

解決済

3回答

3209閲覧

Accessの更新クエリによる同アイテムのカテゴリ抽出

退会済みユーザー

退会済みユーザー

総合スコア0

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Access

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

0グッド

0クリップ

投稿2018/07/26 07:23

問題

番号アイテム名カテゴリ
1ペン文房具
1ペン
1ペンSALE
2消しゴム文房具
2消しゴム新商品
3ホッチキスSALE
3ホッチキス新商品
3ホッチキス事務用具

こんな形のテーブルをAccessで作成しています。
このテーブルを元にクエリで

番号アイテム名カテゴリ1カテゴリ2カテゴリ3
1ペン文房具SALE
2消しゴム文房具新商品
3ホッチキスSALE新商品事務用具

この形で別テーブルに更新させたいです。

##現状
現状では更新クエリを使って一つ目のカテゴリのみは抽出し表示させてます。
同じ番号を複数の列でグループのように認識させれば可能なのかなと思っています。

アドバイスお願いします!

環境はアクセス2016でWindowsです。

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

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

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

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

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

guest

回答3

0

最初のテーブルはクロス集計クエリーによって次のテーブルの形で取り出すことが出来ます。
敢えてテーブルを作らずに、クロス集計クエリーを参照するということでも良いのではないでしょうか。

但し、クロス集計するにしろ、テーブルにするにしろ、カテゴリの並びや順序について、ルールを設けておかないと面倒くさい事になりそうですが。

投稿2018/07/26 09:29

sazi

総合スコア25138

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

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

0

テーブルのフィールドが提示のものだけなら、クエリでは不可能です。
(テーブルにおいて、並び順は不定ですので。)
並び順を一意に決定するフィールドが必要です。

理想的には下記のようなフィールド(グループ内連番)があれば、クロス集計クエリで簡単に実現できます。

番号アイテム名カテゴリグループ内連番
1ペン文房具1
1ペン2
1ペンSALE3
2消しゴム文房具1
2消しゴム新商品2
3ホッチキスSALE1
3ホッチキス新商品2
3ホッチキス事務用具3

sql

1TRANSFORM First(カテゴリ) AS 2SELECT 番号, アイテム名 3FROM テーブル名 4GROUP BY 番号, アイテム名 5PIVOT グループ内連番;

グループ内連番はVBAで入力することになります。
例えば、下記で汎用関数を紹介しています。

グループ毎連番を自動入力する関数 - hatena chips

投稿2018/07/27 00:56

hatena19

総合スコア33620

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

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

0

ベストアンサー

希望通りのクエリを作成するにはまず元になるテーブル(ここではテーブル名「テーブル1」とします)に通し番号(ID)が必要になります。
IDが作成できれば、そのIDと番号を使って番号ごとの(アイテム名ごとの)連番を振ります。
連番の採番方法はSQL SERVER等だとROW_NUMBERを使うのですがACCESSでは利用できないので
DCount関数を利用します。

VBA

1SELECT ID,番号,アイテム名, カテゴリ, 2 DCount("*","テーブル1","ID <=" & ID & "and 番号=" & 番号 ) AS 連番 FROM テーブル1

上記のSELECT文を実行すると下記のようになります。

ID番号アイテム名カテゴリ連番
11ペン文房具1
21ペン2
31ペンSALE3
42消しゴム文房具1
52消しゴム新商品2

以下略

次に上記のSELECT文をFROM句に指定(サブクエリ)して、カテゴリを横に並べます。
ここでもSQL SERVER等だとCASE WHENを使って横並びにするのですがACCESSクエリでは利用できませんので代わりにSWITCHを使います。

VBA

1SELECT 番号,アイテム名 2,MAX(SWITCH (連番=1, カテゴリ, True, NULL)) AS カテゴリ1 3,MAX(SWITCH (連番=2, カテゴリ, True, NULL)) AS カテゴリ2 4,MAX(SWITCH (連番=3, カテゴリ, True, NULL)) AS カテゴリ3 5 FROM [ 6 SELECT ID,番号,アイテム名, カテゴリ, 7 DCount("*","テーブル1","ID <=" & ID & "and 番号=" & 番号 ) AS 連番 FROM テーブル1 8 ]. AS SUB 9GROUP BY 番号,アイテム名

上記のSELECT文を見てお気付きかと思いますがカテゴリ4以上
(つまり同じ番号内にカテゴリの数が4つ以上)の場合は表示されません。
4つ以上発生する場合はその数だけ列を用意してあげる必要があります。

ただ、冒頭に戻りますが元のテーブルに「ID」を付与できないのであれば
この回答は捨て置きください。

投稿2018/07/27 01:25

KiyomiH

総合スコア40

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

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

退会済みユーザー

退会済みユーザー

2018/07/27 02:56

わかりやすい説明ありがとうございます。 CSVを取り込んだテーブルですのでフォールドは新しく作れないので今回はあきらめます。 ありがとうございました。
hatena19

2018/07/27 04:53

AccessにはSQL SERVERにはない、クロス集計クエリという便利な機能があり、これをつえばSWITCHのような面倒なことせずに可能ですし、カテゴリの増減にも自動対応できますぜ。
KiyomiH

2018/07/27 05:20

>hatenaさん ACCESSで困った時にhatenaさんのサイト参考にさせて頂いています。 いつもありがとうございます!! クロス集計クエリはあまり利用したことがなくて、「CASE WHEN」をACCESSでどう表現しようかとばかり考えてしまいました。発想が乏しくなってしまうのは良くないですね。 コメントありがとうございました。もう少しACCESSも勉強してみます。
退会済みユーザー

退会済みユーザー

2018/07/27 07:00

もうひとつだけ質問させてください。 今回グループ内の連番がポイントになっていると思うのですが、もし順番に関係なく同じ番号のカテゴリを横一列にするだけなら解決は可能ですか?
KiyomiH

2018/07/27 07:47

残念ですが、misomiyaさんの希望する集計クエリを実現させるにはグループ内の連番が必要です。 たとえ(1)「文房具、SALE、・・」の順でも(2)「SALE、文房具、・・・」の順でも構わないとしても (1)の場合は「文房具」を1に表示、「SALE」を2に表示する (2)の場合は「SALE」を1に表示、「文房具」を2に表示する と、必ず列順を定める必要があるからです。 あと、ここのhatenaさんのコメントにもある通り、SWITCHを使わずに簡単に集計できるクロス集計クエリがありますので、そちらを参考にしてみてください。
退会済みユーザー

退会済みユーザー

2018/07/27 08:02

KiyomiHさん・hatena19さんありがとうございます! クロス集計クエリと連番についてトライしてみます
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問