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の点数を引き算したいのです。
しかしながらうまく表示しません。どこが悪いかご指摘お願いします。
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にも問題はないような気がしています。
うまく表示されないかわりに、どのようなものが表示されるのでしょうか。
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文を組み立てる以前に、仕様を決める部分を強化したほうがよいですね
No.2
- 回答日時:
ANo.1の補足に書かれたSQLを $kijyun = 70 として実行すると、
以下の結果が出ました。
stensu : 662
hensa : -38
これが正しい結果でしょうか。
hensa は 662 - 700 の結果です。
この回答への補足
ありがとうございます。
正しい結果です。
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>");
これでやっているんですけど・・・
No.1
- 回答日時:
>全科目70点以上の点数を合計
select sum(tensu*(tensu >= 70)) as stensu from testdb
その他いまいち計算根拠がよくわかりません。
合計数から総件数×基準点しているところも何がしたいのかわからないし
それはtensu>=70を適用したいのかどうかとか、いまいちわからないです。
具体的に基準値が○○だった場合に、結果がどうなるのはず・・・
のような書き方の方が検証しやすいですね
この回答への補足
コメントありがとうございます。詳しく説明しますと、各教科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が見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- MySQL 三科目合計点のクラス別平均点求めるクエリ式を教えてください 1 2023/07/04 09:44
- C言語・C++・C# C言語 プログラミング 4 2022/05/22 11:53
- MySQL 下記の問合せを行うクエリを、PhpMyAdminで作成して実行せよ。 第二回模試の3科目の各得点と合 1 2023/04/25 18:02
- 高校受験 あと3ヶ月で偏差値10上げる方法を教えてください 3 2022/12/16 19:14
- 中学校 理科だけが極端に苦手 5 2022/09/10 14:18
- 高校受験 英語科に行くのはアリかナシか 5 2022/11/01 23:41
- 大学受験 神奈川大学の赤本を解いているのですが日本史、英語、国語を解いて採点をした際100点換算ができなく3教 2 2023/01/04 03:07
- SQL Server [SQLServer] テーブル名からカラム名を取得する 1 2022/08/23 21:20
- 高校受験 高校入試で点数を上げたいです!! 5 2022/09/20 23:32
- 中学校受験 中学受験 3 2022/11/13 21:17
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
select文の実行結果に空白行を...
-
SQLで連続したカラムが何個ある...
-
mysql5でGROUP BYごとにLIMIT??
-
割合(パーセント)を求めるには?
-
SQLだけでselect結果に定数を加...
-
空きのID番号を取得する方法
-
Select文1 マイナス Select文2
-
SQL文の入れ子について
-
任意の上位の集計を取得するには?
-
SQLローダーCSV取込で、囲み文...
-
テーブルの最後(最新)のレコー...
-
【PL/SQL】FROM区に変数を使う方法
-
単一グループのグループ関数で...
-
1の行を固定した上でVBAを用い...
-
データ
-
count関数の値をwhere句で使用...
-
SQL文 複数実行
-
AccessのSQL文で1件のみヒット...
-
並べ替えについて
-
枝番の最大値とその前のデータ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
select文の実行結果に空白行を...
-
割合(パーセント)を求めるには?
-
SQL文の入れ子について
-
24時間以内に更新されたデータ...
-
時間帯テーブルから直近空き時...
-
空きのID番号を取得する方法
-
LIMIT句で少なくとも1行は選択...
-
Mysqlで変数を使ったSELECT文の...
-
SQLにて順列の抽出
-
SQLだけでselect結果に定数を加...
-
任意の上位の集計を取得するには?
-
条件付けで集計したものをUNION...
-
mysql5でGROUP BYごとにLIMIT??
-
3テーブルの外部結合
-
MySQLのサブクエリ
-
時間帯テーブルから直近空き時...
-
SQLで連続したカラムが何個ある...
-
SQLローダーCSV取込で、囲み文...
-
単一グループのグループ関数で...
-
テーブルの最後(最新)のレコー...
おすすめ情報