問題
番号 | アイテム名 | カテゴリ |
---|---|---|
1 | ペン | 文房具 |
1 | ペン | 黒 |
1 | ペン | SALE |
2 | 消しゴム | 文房具 |
2 | 消しゴム | 新商品 |
3 | ホッチキス | SALE |
3 | ホッチキス | 新商品 |
3 | ホッチキス | 事務用具 |
こんな形のテーブルをAccessで作成しています。
このテーブルを元にクエリで
番号 | アイテム名 | カテゴリ1 | カテゴリ2 | カテゴリ3 |
---|---|---|---|---|
1 | ペン | 文房具 | 黒 | SALE |
2 | 消しゴム | 文房具 | 新商品 | |
3 | ホッチキス | SALE | 新商品 | 事務用具 |
この形で別テーブルに更新させたいです。
##現状
現状では更新クエリを使って一つ目のカテゴリのみは抽出し表示させてます。
同じ番号を複数の列でグループのように認識させれば可能なのかなと思っています。
アドバイスお願いします!
環境はアクセス2016でWindowsです。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答3件
0
最初のテーブルはクロス集計クエリーによって次のテーブルの形で取り出すことが出来ます。
敢えてテーブルを作らずに、クロス集計クエリーを参照するということでも良いのではないでしょうか。
但し、クロス集計するにしろ、テーブルにするにしろ、カテゴリの並びや順序について、ルールを設けておかないと面倒くさい事になりそうですが。
投稿2018/07/26 09:29
総合スコア25138
0
テーブルのフィールドが提示のものだけなら、クエリでは不可能です。
(テーブルにおいて、並び順は不定ですので。)
並び順を一意に決定するフィールドが必要です。
理想的には下記のようなフィールド(グループ内連番)があれば、クロス集計クエリで簡単に実現できます。
番号 | アイテム名 | カテゴリ | グループ内連番 |
---|---|---|---|
1 | ペン | 文房具 | 1 |
1 | ペン | 黒 | 2 |
1 | ペン | SALE | 3 |
2 | 消しゴム | 文房具 | 1 |
2 | 消しゴム | 新商品 | 2 |
3 | ホッチキス | SALE | 1 |
3 | ホッチキス | 新商品 | 2 |
3 | ホッチキス | 事務用具 | 3 |
sql
1TRANSFORM First(カテゴリ) AS 2SELECT 番号, アイテム名 3FROM テーブル名 4GROUP BY 番号, アイテム名 5PIVOT グループ内連番;
グループ内連番はVBAで入力することになります。
例えば、下記で汎用関数を紹介しています。
投稿2018/07/27 00:56
総合スコア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 | 番号 | アイテム名 | カテゴリ | 連番 |
---|---|---|---|---|
1 | 1 | ペン | 文房具 | 1 |
2 | 1 | ペン | 黒 | 2 |
3 | 1 | ペン | SALE | 3 |
4 | 2 | 消しゴム | 文房具 | 1 |
5 | 2 | 消しゴム | 新商品 | 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
総合スコア40
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/07/27 04:53
2018/07/27 05:20
退会済みユーザー
2018/07/27 07:00
2018/07/27 07:47
退会済みユーザー
2018/07/27 08:02
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。