- ベストアンサー
カウントが出来ません
初心者の質問かもしれませんが聞いてください。現在管理の関係でデータベースを作っているのですが人数のカウントが正常に出来ません。 カウントさせたいのは、国、16以上の男性、16以上の女性、16未満の男性、16未満の女性、を一斉にやりたいのですが・・・お願いします
- みんなの回答 (11)
- 専門家の回答
質問者が選んだベストアンサー
>select >国名, >sum(IIf・・・) As 16歳以上の男, >sum(IIf・・・) As 16歳以上の女, >sum(IIf・・・) As 16歳未満の男, >sum(IIf・・・) As 16歳未満の女, >from テーブル名 >group by 国名 ごめんなさい。カンマが1個所多かったです。 select 国名, sum(IIf・・・) As 16歳以上の男, sum(IIf・・・) As 16歳以上の女, sum(IIf・・・) As 16歳未満の男, sum(IIf・・・) As 16歳未満の女 from テーブル名 group by 国名; こうですね。
その他の回答 (10)
- ARC
- ベストアンサー率46% (643/1383)
あ、なるほどね。 #10,taka_tetsuさんの回答でいいかと思います。 ちなみに、#7のは、国と性別が行見出しで、Over_16が列見出し、値がIDのカウント、です。
- taka_tetsu
- ベストアンサー率65% (1020/1553)
>これは恐らくクロス集計をするのかと思うのですが、 普通の集計クエリで可能です。 >フラグを立てるというとどのような形なのでしょうか? こんな感じですかね。該当の条件に当てはまるときは1、それ以外は0とします。 16歳以上の男 IIf([性別]='男' And [生年月日]<DateSerial(Year(Now())-16,Month(Now()),Day(Now())),1,0) 16歳以上の女 IIf([性別]='女' And [生年月日]<DateSerial(Year(Now())-16,Month(Now()),Day(Now())),1,0) 16歳未満の男 IIf([性別]='男' And [生年月日]<DateSerial(Year(Now())-16,Month(Now()),Day(Now())),0,1) 16歳未満の女 IIf([性別]='女' And [生年月日]<DateSerial(Year(Now())-16,Month(Now()),Day(Now())),0,1) >このようなようにするとしたらSQL文を作らないと駄目でしょうか? select 国名, sum(IIf・・・) As 16歳以上の男, sum(IIf・・・) As 16歳以上の女, sum(IIf・・・) As 16歳未満の男, sum(IIf・・・) As 16歳未満の女, from テーブル名 group by 国名 となります。 sumの括弧の中には、それぞれの式を入れてください。
補足
いまやって見ましたが、これだと何故かフラグが二つ立つのですが・・・例を挙げると 国 性別 16歳以上の男、 16歳以上の女、 16歳未満の男、 16歳未満の女 A 男 0 1 0 1 B 女 1 0 1 0 こんな感じです。 これは一体どのようなことが原因なのでしょうか? あとSQL文にの()のところは(例)16歳以上の男の場合IIf([性別]='男' And [生年月日]<DateSerial(Year(Now())-16,Month(Now()),Day(Now())),1,0)を入れればいいんですよね?なぜか式が正しくないと表示されるのですが・・・
- taka_tetsu
- ベストアンサー率65% (1020/1553)
>国 16以上男性 16以上女性 未満男性 未満女性 >A国 3 4 3 5 >B国 6 1 4 2 作れますよ。 16以上男性フラグ、16以上女性フラグ、16未満男性フラグ、16未満女性フラグを作ってあげれば。 ただし、フラグの値は、条件に合えば1、合わなかったら0にします。 そして、それぞれのフラグは集計ではなく、値の合計を求めれば、希望の形の表になります。
補足
これは恐らくクロス集計をするのかと思うのですが、このようなようにするとしたらSQL文を作らないと駄目でしょうか?フラグを立てるというとどのような形なのでしょうか?現在あまり寝ていないので頭の回転が遅いのでその部分も教えていただけると助かります。m(__)m
- ARC
- ベストアンサー率46% (643/1383)
>IDのカウントの中は全部1という形になっているのです そうなんですか? 当方のはこんな感じなんですが Ct 国 性別 Over_16 3 あっち 男 × 8 あっち 男 ○ 2 あっち 女 × 1 あっち 女 ○ 3 こっち 男 × 2 こっち 男 ○ 3 こっち 女 × 3 こっち 女 ○ で、仰るような形にするには、列が2軸のクロス集計をしなくてはいけないですね。 結論から言いますと、Accessのクエリでは、全く同じ形は出来ません。 こんな感じの表なら作れます。 国 Over_16 女 男 あっち 16以上 1 8 あっち 16未満 2 3 こっち 16以上 3 2 こっち 16未満 3 3 また、データをExcelの方に吐き出せば、Excelのピボットテーブルを使って、かなり柔軟なものを作ることが出来ます。 いずれの場合も、 1:まず、先のクエリを編集し、数式の"○"を"16以上"に、"×"を"16未満"に書き換える 2:グループ化を解除する 3:「IDのカウント」となっている部分は、適当に名前を付け替える 4:適当に名前をつけて保存する。 とします。 あとは、Accessのクエリから、クロス集計ウィザードを使って、保存したクエリを指定して、適当に進めていけば、出来るかと思います。 Excelの場合でしたら、 1:データ→ピボットテーブルと…を実行し、 2:「外部データソース」から「ピボットテーブル」を作成します。 3:データの取出しから、MS Accessを選択し、MDBファイルと、上で作成したクエリとを指定します。クエリ上のすべての列を選択して、最後の選択肢は「Microsoft Excelにデータを返す」です。 後は普通のピボットテーブルと同様の操作ですね。 ヘルプとかを参考にして頑張ってください。 書式や設定を細かく指定すれば、かなりお望みのものに近い表が作れるはずです。
補足
こんな感じの表なら作れます。 国 Over_16 女 男 あっち 16以上 1 8 あっち 16未満 2 3 こっち 16以上 3 2 こっち 16未満 3 3 何故かこのような表すらも作れなかったです・・・ 作れたのは Over_16 性 A国 B国・・・Z国 16以上 男 1 2 16未満 女 1 2 16以上 男 2 1 16未満 女 3 5 こんな感じになってしまいました。クロス集計のやり方違うんだと思うのですが、何事も寝不足なので理解力がないのでどうすればよいのか分からないのでご教授お願いします。 エクセルの集計の方は何かエラー(物理的かな)が出たので再インストールしてからやりたいと思います。
- ARC
- ベストアンサー率46% (643/1383)
>未定義関数にDATEが引っかかりました・・・ あらら(^^; 試しに、Date() を Date に変更して試してみてくださいな。 あと、Date()ではなくて Now()にしても同様の結果が得られるはずですので、そちらでも試してみていただけますか? それでもダメなら、矢張り#4で書いた問題(Accessのバグ)が尾をひいているような気がします。 Accessのバージョンはおいくつですか? 先に書きましたように、サービスパックの導入で現象が改善するかもしれません。 最悪、ツールを利用したOfficeの完全削除→再インストールすれば、動くようになるかと思うんですが… >16以上だけではなく16以上かつ女性、16以上かつ男性、16未満かつ女性、16未満かつ男性という形でいきたいのですが・・・ あ、もちろんこの辺は考慮しています。 もしうまく動いていれば、年齢/性別/国別でのカウントがずらっと表示されるのが確認していただけるはずなんですが…
補足
NOW()でうまくいきました。 ACCESSのバージョンは2000です。XPにしようかと思いましたがいろいろ事情があって出来ないんです。(恐らくお金が無いということで)まぁ完全削除は覚悟はしています。 16以上だけではなく16以上かつ女性、16以上かつ男性、16未満かつ女性、16未満かつ男性 というのは (例) 国 16以上男性 16以上女性 未満男性 未満女性 A国 3 4 3 5 B国 6 1 4 2 という形なんですが。 今の状況を説明すると IDのカウントの中は全部1という形になっているのです。なので出来れば上記の状態で表示をさせたいのです。何かすいません。
- ARC
- ベストアンサー率46% (643/1383)
う~ん、となると、やはりスペルミスか、入力の仕方かの問題になると思うんですが… もう少し詳しく、エラーメッセージを書いていただけたら、解決の糸口が見つかるかもしれません。 (手元のAccess2000+SP3では動いておりますので。) とりあえず今日は寝ます(^^;
補足
あっ何とかなりました。ただ初めに外部取り込みをしたときにネットワークエラーというのは一瞬ヒヤッとしましたが、今は問題ないです。 昨日いただいたものですが、これだとヤバいんです・・・理由は未定義関数にDATEが引っかかりました・・・ もし引っかからないとしても16以上だけではなく16以上かつ女性、16以上かつ男性、16未満かつ女性、16未満かつ男性という形でいきたいのですが・・・大変申し訳ありませんがよろしくお願いします。
- ARC
- ベストアンサー率46% (643/1383)
ん?特に参照設定なんかを追加しなくてもOKなハズなんですが・・・ まずはタイプミスの可能性ですね。 手で打ち込まずに、コピー、ペーストで入力してみたらどうでしょうか。 それでも直らないのでしたら、ひょっとしたら、MDBが部分的に壊れているのかも。 データベースを新規作成して、ファイル→外部データの取り込み→インポートを使用して、お使いのDBのオブジェクトを全部インポートしてみてください。 (もし、参照設定の変更を行っているのでしたら、新規DBの方でも同様の作業を行ってください) もし私の想像通りの現象だとすれば、恐らく上記の作業で直るかと思います。 お使いのAccessが2000でしたら、サービスパック3を導入すればこの現象が起こりにくくなるかと思います。
補足
確かに元に戻りました。しかし先ほどいただいたクエリの計算は出来ませんでした。何か使い方が不正でということが書かれていました。
- taka_tetsu
- ベストアンサー率65% (1020/1553)
>レイアウトというとID、氏名、国名、性別、生年月日、住所です。 というレイアウトであれば、あと1つ項目を追加すれば、集計できますね。 16歳以上フラグみたいなものです。 16歳以上たったら1、未満だったら0みたいな。 追加といっても、テーブルのレイアウトを変更する必要はありません。動的に求めてしまえばいいので。 ただし、DBの種類によって求め方が異なるのでここでは 書けません。 で、あとは select 国名, 性別, フラグ, count(*) from テーブル名 group by 国名, 性別, フラグ こんなSQLで求まります。 >2.DBの種類は? AccessとかOracleとかSQLServerとかってことです。 なんでしょう?
補足
DBの種類はACCESSです。クエリでどうにかなればいいのですが・・・
- ARC
- ベストアンサー率46% (643/1383)
DBはAccess、ですよね。 クエリを新規作成し、フィールド欄にID,国,性別及び次の式を入力します。 Over_16: IIf([生年月日]<DateSerial(Year(Date())-16,Month(Date()),Day(Date())),"○","×") (↑生年月日と現在日付から、満年齢で16歳以上か否かを求めています。生年月日が空の場合は、16歳未満に入力される気がします。) で、Σのアイコンをクリックし、IDの集計のみを「カウント」に設定すれば完成かと。
補足
すいません何から何までありがとうございます。今VBで年の計算をしていたら未定義関数と出てきましたが、どのライブラリーを入れてよいかわかんないです・・・
- taka_tetsu
- ベストアンサー率65% (1020/1553)
1.テーブルレイアウトは? 2.DBの種類は?
補足
レイアウトというとID、氏名、国名、性別、生年月日、住所です。 2.DBの種類は? これはなんと言えばいいでしょう。データ管理かな。それともクエリでカウントするのでSQLと言えばいいでしょうか?ここら辺の知識があまり無いので期待できる答えじゃないかもしれません・・・m(__)m
お礼
返事が遅れて申し訳ありませんでした。大変よく分かりました