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

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

ただいまの
回答率

90.35%

  • VBA

    1899questions

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

  • Access

    470questions

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

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

解決済

回答 3

投稿

  • 評価
  • クリップ 0
  • VIEW 228

misomiya

score 7

 問題

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

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

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

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

現状

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

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

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

+3

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+2

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

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

番号 アイテム名 カテゴリ グループ内連番
1 ペン 文房具 1
1 ペン 2
1 ペン SALE 3
2 消しゴム 文房具 1
2 消しゴム 新商品 2
3 ホッチキス SALE 1
3 ホッチキス 新商品 2
3 ホッチキス 事務用具 3
TRANSFORM First(カテゴリ) AS 
SELECT 番号, アイテム名
FROM テーブル名
GROUP BY 番号, アイテム名
PIVOT グループ内連番;

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

checkベストアンサー

0

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

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


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

ID 番号 アイテム名 カテゴリ 連番
1 1 ペン 文房具 1
2 1 ペン 2
3 1 ペン SALE 3
4 2 消しゴム 文房具 1
5 2 消しゴム 新商品 2

以下略

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

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/07/27 11:56

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

    キャンセル

  • 2018/07/27 13:53

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

    キャンセル

  • 2018/07/27 14:20

    >hatenaさん
    ACCESSで困った時にhatenaさんのサイト参考にさせて頂いています。
    いつもありがとうございます!!

    クロス集計クエリはあまり利用したことがなくて、「CASE WHEN」をACCESSでどう表現しようかとばかり考えてしまいました。発想が乏しくなってしまうのは良くないですね。

    コメントありがとうございました。もう少しACCESSも勉強してみます。

    キャンセル

  • 2018/07/27 16:00

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

    キャンセル

  • 2018/07/27 16:47

    残念ですが、misomiyaさんの希望する集計クエリを実現させるにはグループ内の連番が必要です。
    たとえ(1)「文房具、SALE、・・」の順でも(2)「SALE、文房具、・・・」の順でも構わないとしても
    (1)の場合は「文房具」を1に表示、「SALE」を2に表示する
    (2)の場合は「SALE」を1に表示、「文房具」を2に表示する
    と、必ず列順を定める必要があるからです。

    あと、ここのhatenaさんのコメントにもある通り、SWITCHを使わずに簡単に集計できるクロス集計クエリがありますので、そちらを参考にしてみてください。

    キャンセル

  • 2018/07/27 17:02

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

    キャンセル

同じタグがついた質問を見る

  • VBA

    1899questions

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

  • Access

    470questions

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