accessクエリで下記のような表を作りたいのですが、データベースの作り方の基本がわからないので質問させて下さい。

   A社 B社 C社
面積 広い 普通 狭い
環境 良い 良い 悪い
人員 多い 少ない 多い
開発力 なし なし あり

このような表をクエリで出力させたいと思っています。左の項目はどんどん増えていきます。
このような場合、データベース(テーブル)はどのようにつくるのが基本なのでしょうか。下記のようにすればいいものでしょうか。

   区分 内容
A社 面積 広い
B社 面積 普通
C社 面積 狭い
A社 環境 良い
B社 環境 良い
C社 環境 悪い

#このようにした場合、目的の表示をする場合のクエリなどは、どのようにしたらいいものでしょうか。

このQ&Aに関連する最新のQ&A

A 回答 (1件)

クエリの作り方としては、クロス集計クエリになります。


ただし、普通の作り方としては、「A社」「B社」・・・と「面積」「環境」の軸は入れ替わります。(できなくはないですが・・・)
直接、クエリを作りたければ、例にあげられたテーブルでかまいません。
ただ、正規化(これをきっちりと説明するのは、大変なので、別途探してみてください。)をするなら、少し構造が変わってきます。
まず、会社テーブルをつくり以下のようにします。(主キーは会社ID)

会社ID 社名
1    A社
2    B社
3    C社

あと区分と内容の対比ですがこれを関連づけるとなると区分テーブル、内容テーブルが必要になります。

内容テーブル(主キーは内容ID。内容テーブルは別の振り方もあります。)
内容ID 区分 内容
1    1  広い
2    1  普通
3    1  狭い
4    2  良い
5    2  悪い

区分テーブル(主キーは区分ID)
区分ID 区分
1    面積
2    環境
3    人員

4つ目のテーブルとして、3つのテーブルの関連を結びつけるテーブルを作ります。(これも作り方は、いろいろありますが、1例を挙げます。)

関連テーブル(主キーは会社IDと内容IDの複合主キー)
会社ID 内容ID
1    1
1    4
2    2
2    4
3    3
3    5

ここで会社テーブルの会社IDと関連テーブルの会社ID、区分テーブルの区分IDと内容テーブルの区分ID、内容テーブルの内容IDと関連テーブルの内容IDにリレーションを張ります。

これで正規化されたデータベースができました。利点は、会社・区分・内容が増えたり変更などがあった場合、データベースの変更が一箇所で済み、混乱しないことです。逆に欠点としては、データの検索に時間がかかることです。
あとは、例にあげられているテーブルのように表示するクエリを作るだけです。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

関連するカテゴリからQ&Aを探す

このQ&Aと関連する良く見られている質問

QMs Access テーブルBにテーブルAのCDを充てたい。(クエリ?紐づけ?リレーションシップ?)

初心者です。よろしくお願いします。
そもそも、できるのかどうか、できたとして、どうするのかがわからないです。

次の2つのテーブルがあります。
テーブルマスタA には、①市町村CD ②市町村名 ③住所(番地なし)
テーブル受付データB には、①NO ②住所(番地まであり)③受付日 ④⑤・・・

具体的には、以下のとおり。(サンプル)
テーブルマスタA
①    ②      ③
10000  松戸市    千葉県松戸市
20000  鎌ケ谷市本町 千葉県鎌ケ谷市本町
30000  横須賀市   神奈川県横須賀市
テーブル受付データB
①    ②
1    千葉県松戸市五香5-5-5    
2    千葉県鎌ケ谷市本町さくらがおか8-88-8 ひまわりアパート302
3    神奈川県横須賀市横須賀8-7-8   

テーブル受付データBにおいて、②の部分(市町名まで)と、
テーブルマスタAの③をなんとか紐づけて、

クエリで合体させたい。
=テーブル受付データBに、テーブルマスタAの市町村CDを充てたい。
A①市町村CD  A②市町村名 B② B③ B④ B⑤
とすることを切望しています。

***********
たとえば、2つのテーブルに同じフィールドがあって、
それをリレーションシップで紐づけるのは容易ですが、
今回のようなパターンは、
もしかして、私は、ナンセンスなことをしようと苦闘している?と思ってきました。
フィールド名が同じじゃないのに、それを紐づけることができるのでしょうか?

できるとして、どのようにすればよいのでしょうか?

どうぞ、教えていただきたく、お願いいたします!!!

初心者です。よろしくお願いします。
そもそも、できるのかどうか、できたとして、どうするのかがわからないです。

次の2つのテーブルがあります。
テーブルマスタA には、①市町村CD ②市町村名 ③住所(番地なし)
テーブル受付データB には、①NO ②住所(番地まであり)③受付日 ④⑤・・・

具体的には、以下のとおり。(サンプル)
テーブルマスタA
①    ②      ③
10000  松戸市    千葉県松戸市
20000  鎌ケ谷市本町 千葉県鎌ケ谷市本町
30000  横須賀市   神奈川県横...続きを読む

Aベストアンサー

パラメータが表示されたのは指定したフィールドがないからです。
テーブル名とフィールド名を使用している名前に変更してください。

InStr関数は
ある文字列 (string1) の中から指定された文字列 (string2) を検索し、最初に見つかった文字位置を返す文字列処理関数です。
InStr(string1, string2)

やっていることはテーブル受付データBの②(住所)の中からテーブルマスタAの③(住所)を検索し
文字列がある位置を出しています。
必要なのは文字列が含まれているデータのみなので条件を>0としています。

試しにInStrの部分をなくしてクエリを実行してみてください。
「テーブルマスタA」のレコード数*「テーブル受付データB」のレコード数のデータが表示されるはずです。

QAccess クエリ内のクエリ

クエリの中で、他のテーブルと一致するデータを抽出したいのですが、結果が0件の結果しかかえって来ません。
何処が間違っているのかお教え頂けたら幸いです。

何がしたいかと言うと、「dbo_VIEW_CIJ用売上伝票」の下記項目の中の「T_得意先」の中の抽出フラグのTrueデータを抽出し新しい「T_税抜」テーブルを作成したいのですが、結果は0件しかかえって来ません。
ちなみに、得意先CDのIN句を抜くとちゃんとデータは抽出されます。

《テーブル》
【dbo_VIEW_CIJ用売上伝票】(SQL Serverリンクテーブル)
・納品日付
・伝票NO
・得意先CD
・税抜金額
・消費税区分
・商品名
・摘要
・数量
・単位名
・単価
・金額

{T_得意先】
得意先CD
抽出フラグ(YES・NO型)

《抽出条件》
納品日 : >=#(開始日変数)# And #(終了日変数)#
消費税区分 : 1
得意先CD : IN(SELECT [T_得意先]![得意先CD] FROM [T_得意先] WHERE[T_得意先]![抽出フラグ]='True')

《SQL》
SELECT
dbo_VIEW_CIJ用売上伝票.納品日付, "" AS 部門コード,
dbo_VIEW_CIJ用売上伝票.伝票NO,
dbo_VIEW_CIJ用売上伝票.得意先CD, "" AS F,
dbo_VIEW_CIJ用売上伝票.税抜金額,
dbo_VIEW_CIJ用売上伝票.消費税区分, "" AS 商品CD,
dbo_VIEW_CIJ用売上伝票.商品名,
dbo_VIEW_CIJ用売上伝票.摘要, "" AS ケース数, "" AS 入数,
dbo_VIEW_CIJ用売上伝票.数量,
dbo_VIEW_CIJ用売上伝票.単位名,
dbo_VIEW_CIJ用売上伝票.単価,
[dbo_VIEW_CIJ用売上伝票]![消費税区分]*[dbo_VIEW_CIJ用売上伝票]![税抜金額] AS tmp小計,
[dbo_VIEW_CIJ用売上伝票]![数量]*[dbo_VIEW_CIJ用売上伝票]![単価] AS tmp単価計
INTO Tmp税抜
FROM dbo_VIEW_CIJ用売上伝票
WHERE
(((dbo_VIEW_CIJ用売上伝票.納品日付)>=#10/21/2013# And (dbo_VIEW_CIJ用売上伝票.納品日付)<=#11/20/2013#) AND
((dbo_VIEW_CIJ用売上伝票.得意先CD) In (select [T_得意先]![得意先CD] from [T_得意先] Where [T_得意先]![抽出フラグ] = True)) AND
((dbo_VIEW_CIJ用売上伝票.消費税区分)=1))
ORDER BY dbo_VIEW_CIJ用売上伝票.納品日付;
※上記SQL文は、SQLビューを記載してますが、デザインビューで作成し、得意先CDのIN句の部分は、得意先CDにビルドを使って入力しました。

参考にしたURL
http://office.microsoft.com/ja-jp/access-help/HA010206111.aspx
・サブクエリをクエリ フィールドの抽出条件として使用する

Access2010
Windows7

クエリの中で、他のテーブルと一致するデータを抽出したいのですが、結果が0件の結果しかかえって来ません。
何処が間違っているのかお教え頂けたら幸いです。

何がしたいかと言うと、「dbo_VIEW_CIJ用売上伝票」の下記項目の中の「T_得意先」の中の抽出フラグのTrueデータを抽出し新しい「T_税抜」テーブルを作成したいのですが、結果は0件しかかえって来ません。
ちなみに、得意先CDのIN句を抜くとちゃんとデータは抽出されます。

《テーブル》
【dbo_VIEW_CIJ用売上伝票】(SQL Serverリンクテーブル)
・納...続きを読む

Aベストアンサー

デザインビューで、得意先コードをSELECTする条件のうち、下記の部分がうまく動いていないのだと思います。

誤:[T_得意先]![抽出フラグ]='True'
正:[T_得意先]![抽出フラグ]=0

#ちなみに、Trueは0、Falseは-1と同義です

シングルクオートで括ってしまう('True')と、通常文字列として判断されてしまいます。
ただ、SQLビューで確認できるSQLでは、きちんとシングルクオートを外している(True)ようです。
さらに、上記SQLがエラーが出ている(型違いなど)訳でもなさそうなので、私の指摘の方向が誤っていることも考えられます。

一応、ご参考ということ、宜しくお願い致します。

QAccess あるクエリを利用しているクエリの一覧表示

Accessについて質問させてください。

初心者的質問で申し訳ありませんが、
おわかりになる方がおられましたら教えていただけると助かります。

・質問内容:
あるクエリを利用しているクエリの一覧をみる機能はあるでしょうか?

たとえば、クエリAを利用しているクエリBとクエリC・・・があったとします。
クエリAに変更を加えた場合に、他のクエリに影響がないかチェックしたいと考えた場合に
どのクエリがクエリAを利用しているかを知りたいというのが理由です。

お手数ですが、以上よろしくお願いいたします。

Aベストアンサー

横レス失礼致します。

> 入力テーブルまたはクエリ'MSysObject'が見つかりませんでした。

nda23さんの原文に「s」の脱字があります。
下記のものに修正すれば、エラーにならなくなるはずです。


修正版:
SELECT A.Name AS クエリ名,B.Name1 AS 参照名
FROM (MSysObjects As A LEFT JOIN MSysQueries AS B ON A.Id=B.ObjectId)
LEFT JOIN MSysObjects AS C ON B.Name1=C.Name
WHERE A.Type=5 AND B.Attribute=5 AND C.Type=5;

※上記SQL内の「MSysObjects」や「MSysQueries」は、テーブル名です。
 これらのテーブルは初期設定では見られませんが、以下の手順を踏むと表示させる
 ことができるようになります:
   1)メニューで「ツール(T)→オプション(O)」を選択
   2)『オプション』ダイアログが開いたら、『表示』タブを選択
   3)右側の上から2番目にある『システム オブジェクト(Y)』のチェックをオンにした後、
    『OK』ボタンをクリック
 これで、データベースウィンドウでテーブルの一覧を表示させると、「MSys」で始まる
 テーブル群が表示されます。


・・・なのですが、Access2003なのでしたら、標準機能の『オブジェクトの依存関係』を
使用してしまった方が楽なように思います。
(「調べるクエリが変わる毎に、わざわざSQL文を編集」といった手間が不要なので)

なお、内部的には、結局上記SQLと同様の処理(上記テーブル群の参照)をしているので、
サブクエリやユニオンクエリなどは、やはり対象外です。
(ただ、対象外になるクエリも別に一覧化されるので、個別確認は比較的容易)

以下、その使用方法を説明します:
1)データベースウィンドウでクエリの一覧を表示
2)調べたいクエリを右クリックし、一番下の選択肢「オブジェクトの依存関係」をクリック
3)「オブジェクトの依存関係情報を生成するには、[名前の自動修正情報をトラックする]~」
  のメッセージが表示された場合は、『OK』をクリック
  (上記SQLが正常に動くようなら、多分表示されません)
4)「オブジェクトの依存関係を表示するには、先に依存関係情報を更新する必要が~」の
  メッセージが表示された場合も、『OK』をクリック
  ※上記メッセージも含め、『ヘルプ』は確認しておくことをお勧めします。
   (同じファイルでは、2回目以降は(多分)表示されません)
5)画面右側に『オブジェクトの依存関係』ウィンドウが表示されるので、「このオブジェクトに
 依存するオブジェクト」を選択すると、その下に、右クリックしたクエリを使用している
 テーブルやクエリ、フォームの一覧が表示されます。
 (一番下には、この機能で確認できないサブクエリやユニオンクエリなどが表示されるので、
  こちらは個別に確認します)
 ※表示されたクエリ名などはハイパーリンクになっており、クリックするとそれぞれがデザイン
   ビューで展開されます。


・・・以上です。

横レス失礼致します。

> 入力テーブルまたはクエリ'MSysObject'が見つかりませんでした。

nda23さんの原文に「s」の脱字があります。
下記のものに修正すれば、エラーにならなくなるはずです。


修正版:
SELECT A.Name AS クエリ名,B.Name1 AS 参照名
FROM (MSysObjects As A LEFT JOIN MSysQueries AS B ON A.Id=B.ObjectId)
LEFT JOIN MSysObjects AS C ON B.Name1=C.Name
WHERE A.Type=5 AND B.Attribute=5 AND C.Type=5;

※上記SQL内の「MSysObjects」や「MSysQueries」は、テーブル名です...続きを読む

QAccessのクロス集計クエリから、追加クエリをvbaで記述したいが記述が分からない。

Windows7のAccess2007を使っています。
Accessのクロス集計クエリから、追加クエリをvbaで記述したいが記述
が分からない。

vbaを使わなければ、データベースウインドウで最初にクロス集計のク
エリを作って、そのクエリを使って追加クエリを作れば終わりですが。
これと同じ事をvbaで記述をしたいのですが。

出来るのでしょうか。

例として、収穫テーブルとサイズテーブルのクロス集計を作ると仮定し
て下記の構造で作る物とします。
収穫テーブルは下記の構造です。
1. idと言う名前でオートナンバーの型
2. サイズと言う名前で数値の型

サイズテーブルは下記の構造とします。
1. idと言う名前でオートナンバーの型
2. 名前と言うフィールドの名前でテキストの型

収穫のテーブルは下記のデータが入っています。
ID サイズ
1 1
2 2
3 2
4 2
5 1
6 2
7 3

サイズのテーブルは下記のデータが入っています。
ID 名前
1 大
2 中
3 小

リレーションシップは、一側のテーブルがサイズのテーブルで、idを主
キーとします。多側のテーブルは、収穫のテーブルで多側のキーはサイ
ズです。

ここで、クエリ1の名前で
TRANSFORM Count(収穫.ID) AS IDのカウント
SELECT 収穫.ID
FROM サイズ INNER JOIN 収穫 ON サイズ.ID = 収穫.サイズ
GROUP BY 収穫.ID
PIVOT サイズ.名前;

を実行すると、下記が得られます。
ID 小 大 中
1 1
2 1
3 1
4 1
5 1
6 1
7 1

ここで、クエリ1を使って下記のクエリ2を作ります。
INSERT INTO table1
SELECT クエリ1.*
FROM クエリ1;

上記の操作でクエリ1のクロス集計クエリを使って
クエリ2の追加クエリと言う二つの手段で
クロス集計からデータを作る事が出来ます。

この操作をvbaの手法で作る方法は無いのでしょうか。
この例でのコードの記述を宜しくお願いします。

Windows7のAccess2007を使っています。
Accessのクロス集計クエリから、追加クエリをvbaで記述したいが記述
が分からない。

vbaを使わなければ、データベースウインドウで最初にクロス集計のク
エリを作って、そのクエリを使って追加クエリを作れば終わりですが。
これと同じ事をvbaで記述をしたいのですが。

出来るのでしょうか。

例として、収穫テーブルとサイズテーブルのクロス集計を作ると仮定し
て下記の構造で作る物とします。
収穫テーブルは下記の構造です。
1. idと言う名前でオートナ...続きを読む

Aベストアンサー

こちらが参考になるでしょう。
http://www.accessclub.jp/bbs6/0008/das1904.html


おまけ、上記を参考にした
一応動作するコード。

Dim strSQL As String
strSQL = "INSERT INTO table1 " & _
   "SELECT Q.* " & _
   "FROM [" & _
   "TRANSFORM Count(収穫.ID) AS IDのカウント " & _
   "SELECT 収穫.ID " & _
   "FROM サイズ INNER JOIN 収穫 ON サイズ.ID=収穫.サイズ " & _
   "GROUP BY 収穫.ID " & _
   "PIVOT サイズ.名前 " & _
   "IN ('大','中','小')" & _
   "]. As Q"
Debug.Print strSQL
CurrentDb.Execute strSQL

QJava環境で使用するAccessデータベースについて

以下の様な開発環境でシステムを構築しています。
OS:windowsXP
DB:Microsoft Access 2002
j2sdk:1.4.2_05
Tomcat:4.1.30

Web上で登録画面を表示、登録されたデータをサーブレット経由でDBに登録しようとしたところ、「パラメータが少なすぎます」というメッセージが出て登録できませんでした。
DBおよびSQL構文のエリア名の記入ミスも調べましたが問題ない模様です。
AccessのODBCドライバ(MDAC2.5)について調べたところ、MDAC2.5を使用したSQL文では二重引用符(”)を文字列リテラルとして使用できないようです。
この問題を回避するよい方法があれば、ぜひ教示願います。

<コーディング内容>
//postされた内容を受け取る
String wkkanri = request.getParameter(“kanri_No”);
String wkroom = request.getParameter(“room_No”);
-------------------------------------------------
//ドライバクラスのロード、DB接続
Class.forName(“sun.jdbc.odbc.JdbcOdbcDriver”);
Connection con = DriverManager.getConnection(“jdbc:odbc:syataku”);
Statement stmt = con.createStatement();

//insert用sql文の発行
String sql = “insert into kihon(kanri_No,room_No) values(wkkanri,wkroom)”;
Stmt.executeUpdate(sql);

以下の様な開発環境でシステムを構築しています。
OS:windowsXP
DB:Microsoft Access 2002
j2sdk:1.4.2_05
Tomcat:4.1.30

Web上で登録画面を表示、登録されたデータをサーブレット経由でDBに登録しようとしたところ、「パラメータが少なすぎます」というメッセージが出て登録できませんでした。
DBおよびSQL構文のエリア名の記入ミスも調べましたが問題ない模様です。
AccessのODBCドライバ(MDAC2.5)について調べたところ、MDAC2.5を使用したSQL文では二重引用符(”)を文字列リテラルとして使用で...続きを読む

Aベストアンサー

クォートが全角なのは記載ミスですよね。

例えば、wkkanri に K001 、wkroom に 101 とか入っている
として、Accessに渡したいSQLは

insert into kihon(kanri_No,room_No) values('K001',101)

になります。
しかしお書きになった内容は

insert into kihon(kanri_No,room_No) values(wkkanri,wkroom)

なので、Access側ではエラーになります。
String sql に連結させて、正しいSQLを動的に作ってあげないと。

String sql = "insert into kihon(kanri_No,room_No) values('" + wkkanri + "'," + wkroom + ")";

とかでは?
DB側の型がわからないので、その辺は自助努力で。

もしくはパラメータバインドと言う方法もありますが、まずは
今のやり方を完遂させた方がよいでしょう。

クォートが全角なのは記載ミスですよね。

例えば、wkkanri に K001 、wkroom に 101 とか入っている
として、Accessに渡したいSQLは

insert into kihon(kanri_No,room_No) values('K001',101)

になります。
しかしお書きになった内容は

insert into kihon(kanri_No,room_No) values(wkkanri,wkroom)

なので、Access側ではエラーになります。
String sql に連結させて、正しいSQLを動的に作ってあげないと。

String sql = "insert into kihon(kanri_No,room_No) values('" + wkkanri + "'," ...続きを読む


このカテゴリの人気Q&Aランキング

おすすめ情報