• 締切済み

表の取り出し方で困ってます

以下のような2つのテーブルがあるとして、 [表A:学生マスター] 学生ID 氏名 001   佐藤 002   斉藤 003   田中 [表B:試験結果] 学生ID 試験ID 得点 001   001   80 002   001   70 003   001   60 001   002   75 003   002   85 002   003   90 003   003   85 以下のような集計表を得たいのですが、一発で作成できる(しかも高速な)SQLが思いつきません。 試験結果テーブルに順位が入っていれば簡単なのですが。 どなたかご教示ください。 [集計表] 学生ID 試験1 順位 試験2 順位 試験3 順位 平均得点 001     80   1   75   2   欠席      77.5 002     70   2   欠席      90   1   80.0 003     60   3   85   1   85   2   76.7

みんなの回答

回答No.2

>まず学生テーブルをスキャンし、その各行に対して試験ごとの結果を得る、 >という方法でやってみたのですが遅いので。 どんなSQLか、具体的に提示できませんか? 「遅い」と言われても、クエリの記述レベルでどうなるものか、母体データ件数などを含めて示してもらわないと判断できません。 >DBへの書き込み権限がないのと、 性能を出すため、インデクスの定義を見直すことはできるのですよね? そうでないなら、諦めてください。 >同じ試験問題を後から受ける学生がいるため、順位をあらかじめ入れて >おくことができません。 成績表を作成する直前に、順位を入れればいいのでは? >> 順位を求めるクエリは、自己結合すればできますよね? > 上記のような方法でやってみました。 具体的にどんなSQLなのか、提示できませんか? 「遅い」、「そういう方法でやっている」と日本語だけで示されても、そのクエリが適切なものかどうか判断できず、具体的なアドバイスができません。 > それと、RDBMSは、PostgreSQLなのですよね?バージョンは? > 7.3.18です。 このサイトでは、丸投げは禁止事項ですよ? 自分で考えた内容を示し、具体的に分からない部分を質問することが規約になっています。仕様を提示して、「SQLを作って」といったものは、「質問でなく作業依頼」などとして、せっかく回答しても削除される可能性があります。 PostgreSQL 7.3.18で動くかどうか分かりませんが、8.0では動くSQL例を示します。 1行内で同じ列名でタイトルを出す、同じ列の値として数値と文字を混在して出したりは、すべて文字にキャストしたりしないと実現できませんから念のため。 -- 成績表 select g.gid, max(case sid when 1 then tokuten else null end) as 試験1, max(case sid when 1 then rk else null end) as 順位1, max(case sid when 2 then tokuten else null end) as 試験2, max(case sid when 2 then rk else null end) as 順位2, max(case sid when 3 then tokuten else null end) as 試験3, max(case sid when 3 then rk else null end) as 順位3, cast(avg(tokuten) as dec(4,1)) as 平均得点 from gakusei as g left join (select gid, sid, tokuten, (select count(*)+1 from shiken where sid=x.sid and tokuten>x.tokuten) as rk from shiken as x) as s on g.gid=s.gid group by g.gid order by g.gid

higpy
質問者

お礼

gooから投稿があったことのお知らせが今日届いたので、お礼が遅くなりました。 ご指摘の点は理解できますが、何しろこのDBには書き込み権限がないため、順位を入れておいて集計する、という方法は使えません。 インデックスの問題にしても、担当者にその気がない(そもそも順位を集計する目的に使っていない)みたいで、実現は難しいです。 結局のところ、行と列を入れ替えて、行を試験単位にし、列に学生を並べることでcsv形式に出力し、Excelで行と列を入れ替えて配布することになりました。 貴重なご意見ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。
回答No.1

>一発で作成できる(しかも高速な)SQLが思いつきません。 複数のSQLか、低速なSQLなら、自分で思いつくということですか? >試験結果テーブルに順位が入っていれば簡単なのですが。 そう思うなら、順位を予め入れておけばいいのでは? 順位を求めるクエリは、自己結合すればできますよね? それと、RDBMSは、PostgreSQLなのですよね?バージョンは?

higpy
質問者

補足

> 複数のSQLか、低速なSQLなら、自分で思いつくということですか? まず学生テーブルをスキャンし、その各行に対して試験ごとの結果を得る、という方法でやってみたのですが遅いので。 > そう思うなら、順位を予め入れておけばいいのでは? DBへの書き込み権限がないのと、同じ試験問題を後から受ける学生がいるため、順位をあらかじめ入れておくことができません。 > 順位を求めるクエリは、自己結合すればできますよね? 上記のような方法でやってみました。 > それと、RDBMSは、PostgreSQLなのですよね?バージョンは? 7.3.18です。 サーバースペックについてはわかりません。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 副問い合わせ

    今はこのようなSQL文を書きたいですが・・ table1 user_id | time 1 | 122120 2 | 100530 table2 user_id | name 1  | 佐藤 2    | 田中 SQL文       結果はこう user_id|name| time 001 |佐藤| 122120 002 |田中| 100530 に出力したいけど、初心者なので、方法が良くわかりません。 ご教授ください。

  • Access 表を結合したい

    かなりの初心者です。 以下の二つのテーブル(表1、表2)があるとします。 表1 氏名   電話番号      FAX番号 ------------------------------------------------ 田中   ×××-××××  ×××-×××× 山田   ×××-××××  ×××-×××× 井上   ×××-××××  ×××-×××× 田神   ×××-××××  ×××-×××× 表2 氏名   住所      ------------------------------------------------ 井上   ×××××××××××××× 田中   ×××××××××××××× 山田   ×××××××××××××× 田神   ×××××××××××××× この2つのテーブルから得られたいものは 氏名   電話番号      FAX番号     住所 ------------------------------------------------------------- 田中   ×××-××××  ×××-××××  ×××××× 山田   ×××-××××  ×××-××××  ×××××× 井上   ×××-××××  ×××-××××  ×××××× 田神   ×××-××××  ×××-××××  ××××××        です。クエリを使ってどうすればよいのでしょうか。

  • openoffice calcにて質問があります

    calcで指定条件の名前を表示させたいです 例えば 名前   田中 佐藤 斉藤 勝利数  3    2   4 順位   2位  3位  1位 となっているデータがあるとして これを別のセルに順位の順番で 斉藤 田中 佐藤 と表示させたいのですが、この表示をさせる際に使う関数が分かりません。 どなたか具体的に教えていただけないでしょうか、よろしくおねがいします

  • 【Excel】複数条件の個数集計表について教えて下さい!

    教えて下さい! 以下のようなシフト表があります。 月|日|研修名|コード|人数|担当者|コード|… 5  1  Excel   T-1   5   田中   1 5  2  Word    T-3   4   佐藤   5 5  3  Excel   T-1   4   鈴木   3 5  4  Access   T-2   3   佐藤   5 ”5月に田中さんはExcelの研修を○回やった”といったような集計表を研修ごと・担当者毎に作成したいと思っています。 ”この担当者がこの研修”といったようには決まっていません。 全ての担当者がすべての研修を受け持ちます。 最終的には集計表を以下のようにまとめたいと思っています。              |田中|佐藤|鈴木  Excel  |  |  | Access|  |  | Word  |  |  | 1ヶ月のシフト表のような形なので空白(研修が無いとき)もあります。 そしてできれば1ヶ月1枚のシートで1年分作成し、1年分の集計も取りたいと思います。 計算式としては”研修がT-1で尚かつ担当者が1のものをこのフィールド内でカウントする”といったようなものになるかと思うんですが、うまくいきません。 困っています。教えて下さい。 宜しくお願いします。

  • エクセルでの集計・・・再度です

    お世話になります。 エクセルでの集計につきまして 思っていたよりも複雑でわからないため、 再度質問させていただきました。 内容 名前 教科名 順位  田中 国語  8 佐藤 算数  5 鈴木 理科  1 山田 国語  2 田中 算数  3 佐藤 算数  4 田中 国語  1 佐藤 理科  2 鈴木 算数  8 田中 理科  11 という感じで、名前・教科・順位の羅列が並んでいます。 同じ生徒がどの教科で、順位がどうであったかを集計したいのです。 ちなみに、もし可能ならば集計時に 1番、2番、3番、4番以下 という風にできればいいなと思っています。 ピポットテーブルを使用すると良いと お伺いしたのですが、この場合でも可能でしょうか? どうぞよろしくお願いします。

  • 【エクセル】分を集計して日に変換したいのですが・・・【ピボットテーブル】 

    申し訳ありません。教えてください。 ピボットテーブルで集計シートを作成しています。 通常は分で作業時間を管理しているのですが、 集計シートでピボットテーブルを使って、 日単位(端数がある場合は、時間と分)に置き換えたいのです。 どなたかご教示ください。 よろしくお願いします。 <例> 集計元シート   A   B 1 氏名 作業分数 2 佐藤 120 3 佐藤 100 4 田中 480 5 後藤 240 6 田中 150 7 後藤 240    ↓ ピボットテーブル集計表   A   B 1 氏名 作業日数等 2 佐藤 0日3:40 3 田中 1日2:30 4 後藤 1日 ※集計元シートからいきなりピボットテーブルの集計表のようにはできないと思っています。 ※現状は集計元シートのC列を時間に置き換え集計しています。  (例)C2=B2/1440とし、表示形式を[h]:mmとしています。

  • php、mysqlを使用した得点ランキング

    現在得点ランキングを作成しています。 mysqlの中に入っているデータを取り出して表示させたいのですが、 なかなかうまくいかず困っています。 mysql内 |id|name| |1|山田| |2|佐藤| |3|山田| |4|鈴木| |5|佐藤| |6|山田| |7|鈴木| |8|田中| としております。 表示方法は 順位| 名前 | 得点数 1位 | 山田 | 3 2位 | 佐藤 | 2 2位 | 鈴木 | 2 4位 | 田中 | 1 としたいです。 mysql内に入っている名前の数で得点数を出してなおかつソートで降順にしたいです。 お分かりの方がいらっしゃいましたらご教示お願いします。

    • ベストアンサー
    • PHP
  • アンケート結果を集計するSQLを教えて下さい

    アンケート結果を集計する効率の良いシンプルなSQLを教えて下さい。 MySQLで、以下の状態です。 テーブル名:hoge カラム:id,kbn id...auto kbn...1~5 欲しい結果は、以下の状態です。 順位,kbn,count 1位,5,60ポイント 2位,3,45ポイント 2位,1,45ポイント 4位,4,30ポイント 5位,2,10ポイント ※位やポイントはプログラム側で付与するので不要です。 2位の様に同点の場合は同じ順位を表示し、3位を飛ばし順位を表示させたく思います。 どうぞ、よろしくお願い致します。

    • ベストアンサー
    • MySQL
  • エクセルのセルに入力した名前を数値化

    どなたかご教授頂ければ幸いです。 エクセルの文字列(一覧表)に 田中 田中 鈴木 鈴木 佐藤 田中 田中 佐藤 佐藤 鈴木 佐藤 佐藤 と入力されているものを 集計表に 田中・・・4 鈴木・・・3 佐藤・・・5 とし、集計したいのですが、 名前を数値に読み替える方法がわかりません。 良い方法があればお教えください。 部下の月次訪問件数を容易に集計する方法を模索中です。 余計な入力を部下にさせたくないので、プルダウンで自身の 名前を選ぶだけで入力を完了とし、別の場所に作った 集計表に数値(件数)となって落ちていくものを作りたいと考えています。 よろしくお願いします。

  • EXCELでの項目別集計

    皆さんのお知恵をお貸し下さい。 複数行、複数列にまたがって名前が入力されています。 名前ごとの集計をとりたいのですが、 どうやったらよいでしょうか 田中  山本  斉藤      斉藤  伊藤 山崎  田中     これを 田中  2 山本  1 斉藤  2 伊藤  1 山崎  1 という風に集計をとりたいのですがピボットテーブルではうまくいきません。 名前は特定できるものでなくいくつも種類があるのでCOUNTIFでは対応できません。 何か用意方法はないでしょうか よろしくお願いいたします。

このQ&Aのポイント
  • TS5030のスキャン機能を使用する際、スキャンした文書がぼやけてしまう問題が発生しています。本記事では、ぼやける原因とその対策について解説します。
  • スキャンした文書に変更を加える方法について分からないというお悩みがあります。本記事では、TS5030のスキャン済み文書の編集方法について詳しく解説します。
  • TS5030のスキャン機能を最大限に活用するためには、ぼやけないように注意が必要です。本記事では、スキャン時の設定や文書の配置についてアドバイスします。
回答を見る