Access総合相談所 其の22at BSOFT
Access総合相談所 其の22 - 暇つぶし2ch914:名無しさん@そうだ選挙にいこう
10/01/26 09:41:13
テーブル:作品(作品ID, 作品名)
テーブル:ジャンル(ジャンルID, ジャンル名)
テーブル:作品のジャンル(作品ID, ジャンルID)

ジャンル:ホラー
ジャンル:コメディ

とある場合、
ホラーでコメディな作品を抽出するSQL文が作れません。
ホラーかコメディなら分かるんですが・・・。

915:名無しさん@そうだ選挙にいこう
10/01/26 13:18:11
>>914
作品と作品のジャンルが1対多なんだよな。
サブクエリ使ってジャンルが'ホラー'の作品の中からジャンルが'コメディー'の
作品を抽出する、もしくはカウント使って抽出する。
select tbl作品.作品名
from (tbl作品のジャンル inner join tblジャンル on tbl作品のジャンル.ジャンルID = tblジャンル.ジャンルID) inner join tbl作品 ON tbl作品のジャンル.作品ID = tbl作品.作品ID
where tblジャンル.ジャンル名 = 'ホラー' or tblジャンル.ジャンル名 = 'コメディー'
group by tbl作品.作品名
having count(tbl作品のジャンル.ジャンルID) = 2
確認してないから動くかどうかわからん。
もっとエレガントなやり方ねぇかしら

916:名無しさん@そうだ選挙にいこう
10/01/26 17:29:31
>>914
select 作品名
from (((作品 t1
 inner join 作品のジャンル t2 on t1.作品ID = t2.作品ID)
 inner join ジャンル t3 on t2.ジャンルID = t3.ジャンルID)
 inner join 作品のジャンル t4 on t1.作品ID = t4.作品ID)
 inner join ジャンル t5 on t4.ジャンルID = t5.ジャンルID
where t3.ジャンル名 = 'ホラー' and t5.ジャンル名 = 'コメディ'

select 作品名
from 作品 t1, 作品のジャンル t2, ジャンル t3, 作品のジャンル t4, ジャンル t5
where
 t1.作品ID = t2.作品ID and t2.ジャンルID = t3.ジャンルID and t3.ジャンル名 = 'ホラー' and
 t2.作品ID = t4.作品ID and t4.ジャンルID = t5.ジャンルID and t5.ジャンル名 = 'コメディ'

select 作品名
from 作品 t1
where
 exists (select * from 作品のジャンル t2 inner join ジャンル t3 on t2.ジャンルID = t3.ジャンルID
  where t1.作品ID = t2.作品ID and t3.ジャンル名 = 'ホラー') and
 exists (select * from 作品のジャンル t4 inner join ジャンル t5 on t4.ジャンルID = t5.ジャンルID
  where t1.作品ID = t4.作品ID and t5.ジャンル名 = 'コメディ')

どれでも。

917:914
10/01/26 21:10:24
>>915-916
レスありがとうございます。
>>915さんのは抽出できませんでした。
>>916さんのは3つとも抽出できました。
複雑ですねぇ、INNER JOIN・・・。

私も色々調べて、

SELECT 作品.* FROM 作品
WHERE
作品.作品ID In (SELECT 作品ID FROM 作品のジャンル WHERE ジャンルID=1)
And
作品.作品ID In (SELECT 作品ID FROM 作品のジャンル WHERE ジャンルID=2);

という記述で抽出できました。
でも処理効率は悪いと思います。全レコードを対象に2回検索してるような気がする。
>>915さんの言うように
ホラーで絞り込んでコメディで絞り込んで・・・というのが
レアなジャンルから絞り込んでいけば、効率良さそうですよね。
一応作ってみたんですが、
SQL文見てすぐあきらめました。
複雑すぎてVBAで生成する気が起きません。
料理のデータベースとかで指定した材料の料理を探す、とか
使い道は有りそうなんで覚えなきゃいけないんでしょうけど・・・。
もっと簡単にできると思ってました。

918:名無しさん@そうだ選挙にいこう
10/01/26 21:41:53
>>917
こんな書き方もできるよ。

select 作品名
from 作品 t1
where
 not exists (select * from ジャンル t2 where t2.ジャンル名 in ('ホラー', 'コメディ') and 
 not exists (select * from 作品のジャンル t3 where t1.作品ID = t3.作品ID and t2.ジャンルID = t3.ジャンルID))

919:名無しさん@そうだ選挙にいこう
10/01/27 09:18:55
>>917
作品のジャンルは2回(andまたはor検索する回数だけ)検索しにいくけど、
対象を作品IDで絞れば全件は検索しないで済むさ。

920:名無しさん@そうだ選挙にいこう
10/01/27 09:30:14
【 システム環境  . 】 Vista, Access2007
【 VBAが使えるか .】 いいえ
【 VBAでの回答  】 できればなしでお願いします

クエリでこういったことがやりたいのですが根本的なところを勘違い
しているのかうまくいきません。

1 ○○ 月曜
1 ○○ 火曜
2 ×× 月曜
3 △△ 火曜
4 □□ 水曜



1 ○○ 月曜、火曜
2 ×× 月曜
3 △△ 火曜
4 □□ 水曜

ようは3列目を複数値フィールド化?して1列目をユニークにし、
最終的にCSV出力したいということなのですが…何卒ご教授ください。


921:名無しさん@そうだ選挙にいこう
10/01/27 09:42:43
【 システム環境  . 】 WindowsXP, Access 97
【 VBAが使えるか .】 いいえ
【 VBAでの回答  】 否

No 品名 地域 パターン(AかBか)

001 林檎 青森 A
002 蜜柑 東京 A
003 林檎 東京 B
004 梨  埼玉 A
005 梨  東京 B
005 蜜柑 千葉 B
006 林檎 青森 B

このようにテーブルに入力していて、今まではクロス集計クエリで
行見出しに品名、列見出しに地域で、商品の地域ごとの個数を集計して出していました。
しかしパターンが新しく加わることになって、地域のパターンも分けなくてはならなくなり、
URLリンク(www1.uploda.tv)
こんな感じで集計しないといけないんですがうまくいきません。
クロス集計でこういう風にするにはどうしたらいいんでしょうか?

922:名無しさん@そうだ選挙にいこう
10/01/27 10:57:49
>>921
列見出しのフィールドを、[地域] & [パターン] で文字列結合すればいいんじゃね?
97で確認取れねぇから、まぁ試してみて


923:名無しさん@そうだ選挙にいこう
10/01/27 12:43:50
>>920
再帰で似た感じまでできるんだろうけど、
関数定義した方がいいような気がするなぁ。

924:名無しさん@そうだ選挙にいこう
10/01/27 14:43:02
【 システム環境  . 】 xp, Access2002
【 VBAが使えるか .】 いいえ
【 VBAでの回答  】 なしでお願いします
【 目的 】出勤簿の作成

今までエクセルで出勤簿の作成を行っていましたが、なぜか急にアクセス導入を提案され、いきなりやることに…
簡単な伝票程度しか作成したことが無いので困っております。お力添えをよろしくお願いいたします。
とりあえず、作りたいものはフォームで所属コードを入力をすると

所属コード 社員番号 社員名 ○/○の出勤状況
01    0000 ○山○広  出勤
01    0000 ○山○広  休
01    0000 ○木○美  代休
01    0000 ○田○男  出勤
01    0000 ○山○子  出勤

このような一覧が、一日ずつレポートで出せるようにしたいのですが可能でしょうか?
よろしくお願いいたします。
 


925:名無しさん@そうだ選挙にいこう
10/01/27 15:15:44
>>922
ありがとうございます。
ほかに、パターンがAだった時のみ数を集計したい時はどうすればいいんでしょうか。
パターンにBと入っていたらクロス集計から外すとかも出来ますか?

926:名無しさん@そうだ選挙にいこう
10/01/27 17:38:24
演算結果を表示するテキストボックスが起動直後だけエラーになるのは
フィールド名を参照するオブジェクトを明示してないからかな
エラーになるならなるで別にいいんだけど、日によってエラーになったり
普通に表示されたりするのはなんだか気持ち悪いね

927:922
10/01/27 18:02:17
>>925
集計クエリにパターンのフィールドがなかったら追加、Where条件にして抽出条件入れるんだからねっ!
自習もしっかりなさい。プンプン

>>924
実現したいことは間違いなくできます。ウィザード使うだけでもできるレベルだから、まぁがんばれ。
テーブルは2つ以上になるですよ。

928:名無しさん@そうだ選挙にいこう
10/01/27 20:03:50
>>920
URLリンク(www.f3.dion.ne.jp)

929:名無しさん@そうだ選挙にいこう
10/01/28 01:20:58
フォーム上のtextboxの開始日と終了日をbetweenで繋いでフィルタに反映させています。(VBAにて)
開始日をtext1、終了日をtext2とした場合に質問です。
開始日のみ入力、または終了日のみ入力した場合に○○以前、○○以降というような形でフィルタに反映させるにはどうすればいいでしょうか。
ご教授願います。

930:名無しさん@そうだ選挙にいこう
10/01/28 02:36:40
access2000を使用しています。
一つのクエリで、同じフィールドから2つデータの個数をカウントしたいんですが、無理でしょうか?
フィールドに不良品か良品かを入力しているんですが、
不良品の数と良品の数、両方を集計として出したいんです。
それをさらにクロス集計で商品別の不良品の数と良品の数とで表にしたいと思っています。

931:名無しさん@そうだ選挙にいこう
10/01/28 07:38:58
>>929
質問のなかに答えが出てる気がするけど、何がわからんのだろうか
開始日が空欄だったら100/1/1、終了日が空欄だったら9999/12/13を代入するのもいいんじゃね?

932:名無しさん@そうだ選挙にいこう
10/01/28 08:52:05
>>929
テキストボックスが入力されているかどうかで
between、=>、=< を使い分ける
どうしてもbetweenだけにしたいなら>>931のように代入

>>930
カウントしたいフィールドを良品用と不良品用で2つクエリに登録する

933:名無しさん@そうだ選挙にいこう
10/01/28 12:46:26
>931,932

なるほど!シンプルに書きたいので代入案を使わせていただきます。
ありがとうございました!

934:名無しさん@そうだ選挙にいこう
10/01/28 18:07:06
ここでテストしようぜ
URLリンク(accesshosting.com)



最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch