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

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

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

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

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

検索

検索は、あるデータの集まりの中から 目的のデータを見つけ出すことです。

Q&A

解決済

3回答

741閲覧

accessでクロス検索のような挙動をしたい

tomikawa

総合スコア2

Access

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

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

検索

検索は、あるデータの集まりの中から 目的のデータを見つけ出すことです。

0グッド

0クリップ

投稿2024/03/19 00:41

実現したいこと

accessにて次のような2つのテーブルがあります。

テーブルA(階級と勤務地の直積)
階級,勤務地
平,東京
平,福岡
平,大阪
係長,東京
係長,福岡

テーブルB(階級と勤務地の組み合わせから給与を示すテーブル)
階級,東京,福岡,大阪
平,200000,100000,150000
係長,300000,200000,250000

この2つのテーブルから以下のような表示をするクエリを作成したいです。
階級,勤務地,金額
平,東京,200000
平,福岡,100000
平,大阪,150000
係長,東京,300000
係長,福岡,200000

発生している問題・分からないこと

IIFの入れ子構造で作成できそうだということは確認できたのですが、
実際のデータは階級と勤務地にあたるものの数がとても多いため、
それ以外の方法で作成したいと考えています。

該当のソースコード

特になし

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

IIFの入れ子構造で作成できはすること

補足

Access 2007 - 2016 です。

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

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

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

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

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

logres_Fan

2024/03/19 01:00

> この2つのテーブルから以下のような表示をするクエリを作成したいです。  この場合、クエリ作成じゃなくて、1つのテーブルにまとめる作業を検討するんじゃないかな?クロス表を土台にクエリなどを組み上げる事はやりません。
guest

回答3

0

直接の回答ではありません。
テーブルBと作りたいというクエリは同じものなので、クエリでどうこうではなく、テーブルの作り直しが必要なように思います。
私なら以下のようなテーブルを作成して、給与に関しては手入力します。
金額が、階級と勤務地の2つに依存しているからです。

テーブル

[階級]テーブル

階級ID階級名
1
2係長

[勤務地]テーブル

勤務地ID勤務地名
1東京
2福岡
3大阪

[給与]テーブル

給与ID階級勤務地金額
111200000
212100000
313150000
421300000
522200000
623250000

クエリ

SELECT 階級ID, 階級名, 勤務地ID, 勤務地名, 金額 FROM 階級 RIGHT JOIN (勤務地 RIGHT JOIN 給与 ON 勤務地.勤務地ID = 給与.勤務地) ON 階級.階級ID = 給与.階級

どうしても元のテーブルでクエリを作成するのであれば、以下のようになるでしょうか。

SELECT 階級, 勤務地, IIf(勤務地 = "東京", DLookup("東京", "テーブルB", "階級='" & 階級 & "'"), IIf(勤務地 = "福岡", DLookup("福岡", "テーブルB", "階級='" & 階級 & "'"), DLookup("大阪", "テーブルB", "階級='" & 階級 & "'"))) AS 金額 FROM テーブルA

金額が階級か勤務地のどちらかと結合可能か、階級と勤務地から導き出せる係数のようなものが無い以上、現状のテーブル構成では難しいと思います。私が無知なだけかもしれませんが。
というよりも、テーブルBと作成したいクエリは同じものなので、DBでどうこうする必要はありません。
おとなしく手入力するか、入力フォームを作成するくらいでしょうか。

追記

他の方の回答でズバリできていますね笑
失礼いたしました。
ついでに入力フォームはこんな感じになります。
イメージ説明

投稿2024/03/19 01:57

編集2024/03/19 02:36
sakizakino

総合スコア13

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

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

tomikawa

2024/03/21 06:31

フォームの例なども提示いただきありがとうございます。 参考にさせていただきます。
guest

0

ベストアンサー

テーブルBを正規化すれば良いので、ユニオンクエリーを用います。

SQL

1select 階級, '東京' as 勤務地, 東京 as 金額 from テーブルB 2union all select 階級, '福岡' as 勤務地, 福岡 as 金額 from テーブルB 3union all select 階級, '大阪' as 勤務地, 大阪 as 金額 from テーブルB

上記をテーブルAと階級と勤務地で結合すれば意図する結果の表示になります。

投稿2024/03/19 02:07

sazi

総合スコア25300

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

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

tomikawa

2024/03/21 06:32

お教えいただいた方法で望む動作を実現できました。 こちらの内容が最もシンプルに実現できそうなため、こちらをベストアンサーにさせていただきます。 ありがとうございました。
guest

0

現状の正規化されていないテーブルから、クエリで正規形に変換して、それから正規形のテーブルを作成したいということでしょうか。
データベースで現状のテーブルのまま運用をするのは効率が悪すぎるので。

クエリでできないことはないですが、どうせテーブルにするのなら、
VBA(DAOかADO)でテーブルAとテーブルBをレコードセットとして読み込んで、正規形のテーブルに書き込んでいくという処理を作成した方がシンプルかと思います。


よく考えたら、DLookup関数を使えばクエリでも簡単にできますね。

SQL

1SELECT 2 テーブルA.階級, テーブルA.勤務地, 3 DLookUp([勤務地],"テーブルB","階級='" & [階級] & "'") AS 金額 4FROM テーブルA;

このクエリからテーブル作成クエリでテーブル化すればいいでしょう。

投稿2024/03/19 01:25

編集2024/03/19 02:31
hatena19

総合スコア34053

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

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

tomikawa

2024/03/21 06:33

「クエリで求める形式を出したい」という要望に答えていただきありがとうございます。 参考にさせていただきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問