• ベストアンサー

MySQLで合計と小計の計算方法を教えてください パート2

MySQLで合計と小計の計算方法を教えてください パート2 name | kamoku | tensu         テーブル:testdb  --------------------------- 001    英語   95 001    国語   90 001    理科   75 001    社会   73 001    算数   62 002    英語   93 002    国語   87 002    理科   78 002    社会   71 002    算数   68 -------------------------------- 30人位いるのですが、やりたい事は以下になります。 基準点数(好きな点数を入力)$kijyunt sql = select sum(tensu) as stensu, sum(tensu)-(select count(*) * $kijyun from testdb) as hensa from testdb where tensu >= 70 全科目70点以上の点数を合計し、全体のレコード×70の点数を引き算したいのです。 しかしながらうまく表示しません。どこが悪いかご指摘お願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • dell_OK
  • ベストアンサー率13% (742/5653)
回答No.4

ANo.2の補足に書かれたコードをPHPで一通り組み立てるとこんな感じでしょうか。 省略されたと思われるデータベース接続部分とSQL生成部分を追加しています。 本来、画面から手入力されるのであろう基準点数の入力部分は省き $kijyun = 70 としています。 後はそのままですが、結果は正しく表示されました。 点数偏差 : -38点 レース数 : (何が表示されるのかわかりませんが、空白) ---- <?php $con = mysql_connect("localhost","user"); $sel = mysql_select_db("test"); $kijyun = 70; $sql = "select sum(tensu) as stensu, sum(tensu)-(select count(*) * $kijyun from testdb) as hensa from testdb where tensu >= $kijyun"; $res = mysql_query($sql); print("<table border=\"0\">"); print("<tr><td>"); print("<table border=\"1\">"); print("<tr><TH><font size=3>点数偏差</font></TH><TH><font size=3>レース数</font></TH></TR>"); while($col = mysql_fetch_array($res)) { print("<tr>"); print("<TD>".$col[stensu]."</TD>"); print("<TD><font size=3>" . $col[hensa] . "点</font></TD>"); print("</tr>"); } print("</table>"); ?> ---- それから、ANo.3のご回答にあるSQL(詳しい説明は省きますが、私は今、このSQLを見て勝手な解釈をし、すばらしいと感じた、世間では一般的かも知れませんが、最近MySQLをはじめた私には、今、新たに学んだ事ですので、とてもすばらしいと思うSQL)を利用すれば、無駄な部分を少し簡略化できます。 select sum(tensu*(tensu>=$kijyun)) as stensu ,sum(tensu*(tensu>=$kijyun))-sum($kijyun) as hensa from testdb 基準点数として減算している、レコード数×基準点数と言うのは、 where をなくしたこのSQLでは全レコード数を対象としますので、カウントするまでもなく $kijyun をそのまま合計すればいいだけです。 SUMとSUMを演算するのは、SUMの中で演算してもいいと思うので、さらに簡略化できます。 select sum(tensu*(tensu>=$kijyun)) as stensu ,sum(tensu*(tensu>=$kijyun)-$kijyun) as hensa from testdb ただ、仕様(人間が意識している手順をおった動作)と、簡略化(あるいは、最適化)されたソースコード(確実な結果が最小コードや最速コードで得られるようにしたために「何をしているのかよくわからない」)の表現力と理解力にギャップが生じますのでそこまでしない方がいい場合もあります。 結局のところ、質問者様のソースコードにも、SQLにも問題はないような気がしています。 うまく表示されないかわりに、どのようなものが表示されるのでしょうか。

php2864
質問者

お礼

今回は、うまくいきました。ありがとうございました!

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

その他の回答 (3)

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.3

>このようにしたほうがいいですよね。 だから・・・ 具体的な数字で示してもらえないと、質問者さんが頭の中で考えているのと こちらの提示するものがあっているかどうか判断できないんですよ とりあえず、#2さんの計算根拠にのっとるとこんな感じで・・・ SET @kijyun=70,@goukaku=70; select sum(tensu*(tensu>=@goukaku)) as stensu, sum(tensu*(tensu>=@goukaku))-(select count(*) * @kijyun from testdb) as hensa from testdb; SQL文を組み立てる以前に、仕様を決める部分を強化したほうがよいですね

全文を見る
すると、全ての回答が全文表示されます。
  • dell_OK
  • ベストアンサー率13% (742/5653)
回答No.2

ANo.1の補足に書かれたSQLを $kijyun = 70 として実行すると、 以下の結果が出ました。 stensu : 662 hensa : -38 これが正しい結果でしょうか。 hensa は 662 - 700 の結果です。

php2864
質問者

補足

ありがとうございます。 正しい結果です。 SQLの式があっているとなると、PHPで吐き出す指示ができていないんでしょうか。 $res = mysql_query($sql); print("<table border=\"0\">"); print("<tr><td>"); print("<table border=\"1\">"); print("<tr><TH><font size=3>点数偏差</font></TH><TH><font size=3>レース数</font></TH></TR>"); while($col = mysql_fetch_array($res)) { print("<tr>"); print("<TD><font size=3>" . $col[hensa] . "点</font></TD>"); print("</tr>"); } print("</table>"); これでやっているんですけど・・・

全文を見る
すると、全ての回答が全文表示されます。
  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.1

>全科目70点以上の点数を合計 select sum(tensu*(tensu >= 70)) as stensu from testdb その他いまいち計算根拠がよくわかりません。 合計数から総件数×基準点しているところも何がしたいのかわからないし それはtensu>=70を適用したいのかどうかとか、いまいちわからないです。 具体的に基準値が○○だった場合に、結果がどうなるのはず・・・ のような書き方の方が検証しやすいですね

php2864
質問者

補足

コメントありがとうございます。詳しく説明しますと、各教科70点を合格の基準と設定しております。 今は、1クラスしかないのですが、他の先生の分と学年で算出したいと思っております。 求めたい結果は、各科目70点以上の点数の合計と全体の科目数(レコード数)×70点を求め、その差分を求めます。 このときの70点未満は点数に入れません。 このときの結果によって、合格点数基準を落としたいので、$kijyunにて合格点数を変えて行きたいのです。 上記のSQLを入れても、旨く表示されないのです。 sql = select sum(tensu) as stensu, sum(tensu)-(select count(*) * $kijyun from testdb) as hensa from testdb where tensu >= $kijyun このようにしたほうがいいですよね。 ご教授願います。

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

関連するQ&A

  • MySQLで合計と小計の計算方法を教えてください

    SQLで判らないことがあります。 生徒NO | 科目 | 点数         テーブル:testdb  --------------------------- 001    英語   95 001    国語   90 001    理科   75 001    社会   73 001    算数   62 002    英語   93 002    国語   87 002    理科   78 002    社会   71 002    算数   68 -------------------------------- 30人分位あり、(全員の5科目の合計)- (国語と社会の合計)=(表示したい数値)にしたいのです。 $sql = "select SUM(点数) as goukei,SUM(点数)-(select SUM(点数) from testdb where 科目=国語 and 科目=社会)as shoukei from testdb "; また、基準点数を儲けて合計点数-基準点数も求めたいのです。$kijyunは変数。 $sql2 = "select SUM(点数) as goukei,SUM(点数)-(select count(*) * $kijyun from testdb )as kijyunten from testdb "; 上記で結果が得られません。教えてください!

    • ベストアンサー
    • MySQL
  • MySQLのデータをPHPで多次元連想配列にしたい

    MySQLのデータを多次元連想配列にする方法を教えて下さい。 下記のような多次元連想配列のデータがあります。 これと同様のMySQLに登録されたデータから多次元連想配列を作りたいと思います。 $test= array( array("id" => "1","kamoku" => "算数","tensu" => "70"), array("id" => "2","kamoku" => "理科","tensu" => "88"), array("id" => "3","kamoku" => "国語","tensu" => "90"), ); print_r($test); ---print_r($test)の結果--------------------------------- Array ( [0] => Array ( [id] => 1 [kamoku] => 算数 [tensu] => 70 ) [1] => Array ( [id] => 2 [kamoku] => 理科 [tensu] => 88 ) [2] => Array ( [id] => 3 [kamoku] => 国語 [tensu] => 90 ) ) -------------------------------------------------------- これと同様のデータをMySQLに作成します。 テーブル名:test 列名:id,kamoku,tensu MySQLからデータを取得 try { $dbh = new PDO($DSN , $DBUSER , $DBPASS); $query = select * from test $stmt = $dbh->prepare($query); $stmt->execute(); while($result = $stmt->fetch(PDO::FETCH_ASSOC)) { $id = ($result['id']); $kamoku = ($result['kamoku']); $tensu = ($result['tensu']); } } catch(PDOException $e) { print "Error!: " . $e->getMessage() . "<br>"; die(); } このソースの中で何らかの処理をして print_r($test); を実行したときに ---print_r($test)の結果--------------------------------- Array ( [0] => Array ( [id] => 1 [kamoku] => 算数 [tensu] => 70 ) [1] => Array ( [id] => 2 [kamoku] => 理科 [tensu] => 88 ) [2] => Array ( [id] => 3 [kamoku] => 国語 [tensu] => 90 ) ) -------------------------------------------------------- というような、文頭で記載したものと同じ結果を得たいと思います。 while内で print_r($result);を行うと1行ずつ下記のような連想配列 Array ( [id] => 1 [kamoku] => 算数 [tensu] => 70 ) が取得できているのでこれを連結させて $test_sample=<<<EOF array("id" => "1","kamoku" => "算数","tensu" => "70"), array("id" => "2","kamoku" => "理科","tensu" => "88"), array("id" => "3","kamoku" => "国語","tensu" => "90") EOF; という配列の中身は作ることができました。 (1)ケース1 $test=array($test_sample); print_r($test); としてもダメで、 Array ( [0] => array("id" => "1","kamoku" => "算数","tensu" => "70"), array("id" => "2","kamoku" => "理科","tensu" => "88"), array("id" => "3","kamoku" => "国語","tensu" => "90") ) というようにうまく多次元連想配列になっていません。 (2)ケース2 $test='array('.$test_sample.')'; print_r(test); としてみたところ、 array( array("id" => "1","kamoku" => "算数","tensu" => "70"), array("id" => "2","kamoku" => "理科","tensu" => "88"), array("id" => "3","kamoku" => "国語","tensu" => "90")) というように配列ではなく単なる文字列として表示されてしまいます。 配列の中身を変数で扱う時には特別な記述法などがあるのでしょうか?

    • ベストアンサー
    • PHP
  • PHP+MySQLから結果セット取得後の計算方法

    PHP+MySQLから結果セット取得後の計算方法を教えてください。 イメージは以下になります。 以下、testtable とします。 生徒|国語|算数|理科|社会 A 60 80 90 60 B 80 60 70 65 C 95 30 50 90 D 100 95 85 90 そこで、国語が80点以下の生徒を検索し、抽出した生徒の算数平均点数を導きたいのです。 //国語が80点以下の生徒を抽出 $sql="SELECT * from testtable WHERE 国語<=80"; $rst= mysql_query($sql); 上記で国語が80点以下の生徒を検索出来たと思うのです。 イメージは下記になります。 生徒|国語|算数|理科|社会 A 60 80 90 60 B 80 60 70 65 算数の平均を求めるので、(80+60)/2の式を書きたいのです。 平均の2は、mysql_num_rows($rst)で導き出せるのですが、 (80+60)の部分がわかりません。 while ($col = mysql_fetch_array($rst)){ $sum=$sum+$col[算数];} $body.= "平均".$sum/mysql_num_rows($rst)."点"; でよいでしょうか。 ご教授願います。

    • ベストアンサー
    • MySQL
  • 合計の出し方

    よろしくお願いいたします。 プログラミングの勉強中です。 国語:78 算数:94 理科:68 社会:70 英語:75 合計点は385点です。 と表示されるプログラムを作り、数字は変えられるようにscanfを使用します。 自分で以下のように作ってみたのですが、合計だけがめちゃめちゃな数で出て来てしまいます。 どこが間違っているか教えていただけますか? #include<stdio.h> main() { int kokugo; int sansuu; int rika; int syakai; int eigo ; int sum = kokugo+sansuu+rika+syakai+eigo; printf("国語:"); scanf("%d",&kokugo); printf("算数:"); scanf("%d",&sansuu); printf("理科:"); scanf("%d,&rika"); printf("社会:"); scanf("%d,&syakai"); printf("英語:"); scanf("%d,&eigo"); printf("合計点は%d点です。",sum); }

  • エクセルの質問です。

    エクセル2003を使用しています。 元データには   A   B(国語点数) C(算数点数) D(社会点数) E(理科点数 F(英語点) G(合計) 1 名前(1)   90        85        70       100      20    365 2 名前(2)   85        20        40       70       50    265    3 名前(3)   50        90        60       70       80    350 というデータを     A    B    C 1 名前(1)  国語  90 2        算数  85 3        社会  70 4        理科  100 5        英語  20 6        合計  365 7 名前(2)  国語  85 8        算数  20 9        社会  40 10       理科  70 11       英語  50 12       合計  265       ・       ・       ・ となるように表示していきたいのですが… ただのセルのコピーでは人が連続してコピーできませんでした。 何かいい方法があるかたはご教授ねがいます。 よろしくお願いします。   

  • mysqlのスマートな書き方

    MySQL5.1とPHP5を使っています。 phpからmysqlのtestテーブルにアクセスして点数順に生徒名一覧を作成したいと思っています。 イメージとしてはこのような感じです。○○○は名前になります。 90点以上 ○○○ ○○○ 80点以上 ○○○ ○○○ ○○○ 70点以上 ○○○ ○○○ ○○○ ○○○ このような一覧を表示するため、下記のように作成したところ上記のような表示をしてくれました。 しかしながら、同じmysql_queryを何度も使っていますし、DBに負担が掛かりそうな気がします(本当に負荷があるのかは分かりませんが・・・) もっとスマートな書き方はないものでしょうか。 よろしくお願い致します。 echo "90点以上"; $rs = mysql_query("select * from test where kamoku = '1' order by tensu desc LIMIT 0, 100;",$conn); while($res = mysql_fetch_array($rs, MYSQL_ASSOC)){ if ($res['tensu'] >= 90){ echo $res['name']; echo "<br>" ; } } echo "80点以上~90点未満"; $rs = mysql_query("select * from test where kamoku = '1' order by tensu desc LIMIT 0, 100;",$conn); while($res = mysql_fetch_array($rs, MYSQL_ASSOC)){ if($res['tensu'] >= 80 and $res['tensu'] < 90 ){ echo $res['name']; echo "<br>" ; } } echo "70点以上~80点未満"; $rs = mysql_query("select * from test where kamoku = '1' order by tensu desc LIMIT 0, 100;",$conn); while($res = mysql_fetch_array($rs, MYSQL_ASSOC)){ if($res['tensu'] >= 70 and $res['tensu'] < 80 ){ echo $res['name']; echo "<br>" ; } }

    • ベストアンサー
    • MySQL
  • 2つの異なるテーブルを和結合し、重複のない名前だけ出力する方法

    2つの異なるテーブルを和結合し、重複のない名前だけ出力させるSQLを書きたいのですが どこが間違っているでしょうか? select distinct name from ( select name from test1 union select name from test2 ) ; test1テーブル name 国語 算数 理科 社会 test1テーブル name 国語 体育 家庭科 社会 結果 name 国語 算数 理科 社会 体育 家庭科

  • sqlのVIEWの作り方

    mysqlでviewを作ろうと考えています。 書籍を調べて3日くらい格闘していましたが挫折してしまい アドバイスをいただきたく、質問いたします。 テーブル名: kamoku kamoku_id name ------------------ 001 国語 002 算数 003 理科 004 社会 テーブル名: siken siken_id siken_name kamoku_id1 kamoku_id2 kamoku_id3 ------------------------------------------------------- 000011 試験1回目 001 002 003 000012 試験2回目  001 003 004 000013 試験3回目 001 002 004 000014 卒業試験 003 004 null この2つのテーブルからVIEWを作りたいと考えています VIEW名 siken_kamoku siken_id siken_name kamoku_id1 kamoku_id2 kamoku_id3 ------------------------------------------------------- 000011 試験1回目 国語 算数 理科 000012 試験2回目  国語 理科 社会 000013 試験3回目 国語 算数 社会 000014 卒業試験 理科 社会 科目名を一回で取得できるようなViewを作りたいのですが CREATE VIEW view_siken_kamoku ( siken_id, siken_name, kamoku_name1, kamoku_name2, kamoku_name3 ) AS SELECT siken.siken_id, siken.siken_name, kamoku.kamoku_name, kamoku.kamoku_name, kamoku.kamoku_name WHERE siken_kamoku_id1 = kamoku.kamoku_id AND siken_kamoku_id2 = kamoku.kamoku_id AND siken_kamoku_id3 = kamoku.kamoku_id; 以上の文ですとエラーがでます。 どのような文にすれば、上記のようなVIEWがえられますでしょうか おたすけてください

    • ベストアンサー
    • MySQL
  • 二次元配列のソート方法がわかりません

    下記のデータがあったときに、点数の低い人だけを表示するプログラムを作りたいのです。 ■データ <?php $data[] = array("kamoku" => "国語", "value" => "80", "name" => "島田","class"=>"5組"); $data[] = array("kamoku" => "算数", "value" => "98", "name" => "山田","class"=>"4組"); $data[] = array("kamoku" => "国語", "value" => "70", "name" => "島田","class"=>"5組"); $data[] = array("kamoku" => "理科", "value" => "10", "name" => "鈴木","class"=>"2組"); $data[] = array("kamoku" => "国語", "value" => "68", "name" => "島田","class"=>"5組"); $data[] = array("kamoku" => "理科", "value" => "35", "name" => "斉藤","class"=>"2組"); $data[] = array("kamoku" => "国語", "value" => "18", "name" => "鈴木","class"=>"2組"); $data[] = array("kamoku" => "理科", "value" => "90", "name" => "島田","class"=>"5組"); ?> ■結果(一番低い人だけを表示)   国語 18点 鈴木   算数 98点 山田   理科 10点 鈴木 どのようにソートすればよろしいでしょうか? 教えてくださいますようお願いします。

    • ベストアンサー
    • PHP
  • Accessの合計

    Accessで練習をしています。 例えば、氏名、国語、算数、理科、社会の項目でデータを 入力していったとき、フォームで、各教科の合計や平均を 表示するのはできたのですが、個人の各教科の合計を 表示するにはどのように式を書けばいいのでしょうか?? また、何教科か選択しての合計もできるでしょうか? よろしくおねがいします。