こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

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 ";

上記で結果が得られません。教えてください!

投稿日時 - 2008-06-17 23:18:02

QNo.4108935

すぐに回答ほしいです

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

ANo.5の補足のご希望方法と、元のSQLでの実行結果表示サンプルです。

最初の2行はMySQLへアクセスするためのクラスを定義しています。
これは私のしている方法であって、質問者様の開発環境などにより異なると思いますので、
それ以降の mysql-> などはそれぞれ質問者様の開発環境に合わせて読みかえてください。

<?php
require_once("class_mysql.php");
$mysql = new MySQL;

//基準
$kijyun = 70;

//1つめのSQL
$sql = "select SUM(点数) as goukei,SUM(点数)-(select SUM(点数) from testdb where 科目='国語' or 科目='社会') as shoukei from testdb";
$mysql->query($sql);
$row = $mysql->fetch();
echo "合計:".$row["goukei"];
echo "<br>";
echo "小計:".$row["shoukei"];
echo "<br>";
echo "<br>";

//2つめのSQL
$sql = "select SUM(点数) as goukei,SUM(点数-$kijyun) as kijyunten from testdb";
$mysql->query($sql);
$row = $mysql->fetch();
echo "合計:".$row["goukei"];
echo "<br>";
echo "基準点:".$row["kijyunten"];
echo "<br>";
echo "<br>";

//ご希望のPHPコードでの計算表示方法(1つ目のSQLに該当)
$sql1 = "select SUM(点数) as goukei from testdb";
$mysql->query($sql1);
$row = $mysql->fetch();
$goukei = $row["goukei"];
$sql2 = "select SUM(点数) as shoukei from testdb where 科目='国語' or 科目='社会'";
$mysql->query($sql2);
$row = $mysql->fetch();
$shoukei = $row["shoukei"];
$goukei_hiku_shoukei = $goukei - $shoukei;
echo "合計:".$goukei;
echo "<br>";
echo "小計:".$shoukei;
echo "<br>";
echo "合計-小計:".$goukei_hiku_shoukei;
echo "<br>";
echo "<br>";
?>

以上のような感じになると思います。

ご希望通りのつもりでPHPコードで計算してみましたが、
これでも、実際は、SQLを1回しか実行しない方が効率的です。
また、これでSQLの実行がうまくいき、
結果が正しく表示される事を確認されましたら、
元の方法でやられた方がいいと思います。
たぶん、どこかにコーディングミスがあるだけだと思います。

投稿日時 - 2008-06-23 09:33:52

お礼

いろいろ教えていただきありがとうございました。

結局、出来ませんでした。

Classもこれから勉強します。

投稿日時 - 2008-06-24 18:24:35

ANo.6

このQ&Aは役に立ちましたか?

2人が「このQ&Aが役に立った」と投票しています

回答(6)

ANo.5

ANo.4の訂正。

2つ目のSQL文。
select
SUM(点数) as goukei
,SUM(点数-$kijyun) as kijyunten from testdb

私は自作のSQL実行ツールで結果を表示しています。
PHPによるSQL文の生成をしておりませんので、
ツールでの実行結果は $kijyun を 70 と置き換えて実行したものです。

select
SUM(点数) as goukei
,SUM(点数)-(
select SUM(点数) from testdb where 科目='国語' or 科目='社会'
) as shoukei from testdb

select
SUM(点数) as goukei
,SUM(点数-70) as kijyunten from testdb

投稿日時 - 2008-06-20 09:21:04

補足

ありがとうございます。
欲しい結果が得られません。たぶんPHPのプログラムがおかしいのかもしれません。
$sql1=select SUM(点数) as goukei from testdb

$sql2=select SUM(点数) from testdb where 科目='国語' or 科目='社会'

$sql = $sql1 - $sql2;
selectの計算ががうまくいかないので、
各合計を変数として扱い、引き算などすると分かりやすいのですが、こういうことはできないのでしょうか。

投稿日時 - 2008-06-20 19:15:27

ANo.4

どうしてうまくいかないのでしょうね。
私もテーブル testdb を作成して、
質問にあるサンプルデータ10レコードをしてSQLを実行してみましたが、
どちらも正しい結果が返されてきます。

1つ目のSQL文の結果はこれでよろしいでしょうか。
goukei 792
shoukei 471

2つ目のSQL文は次のように書く事もできると思います。
select
SUM(点数) as goukei
,SUM(点数)-SUM($kijyun) as kijyunten from testdb

結果はこれでよろしいでしょうか。
goukei 792
kijyunten 92

「表示されません」と言う事ですので、
SQLは正常に結果を返しているけど、
PHPで表示する箇所に問題があるかも知れないわけですね。
SQL実行ツールがあるのでしたら、
ひとまずSQL文の正確性を確かめてみてください。

投稿日時 - 2008-06-20 09:15:35

ANo.3

こんな感じでは?

select SUM(点数) as goukei
,SUM(点数)-sum(点数 * (科目='国語'))-sum(点数 *(科目='社会')) as kijunten
FROM mtestdb

投稿日時 - 2008-06-18 12:45:43

補足

$sql2 = "select SUM(点数) as goukei,SUM(点数)-(select count(*) * $kijyun from testdb )as kijyunten from testdb ";

上記の意味は、例えば試験の難易度などあるので、生徒が70点平均を取らせたいという意思が先生にはあります。

このため、実際の点数合計-基準点×レコード数で0に近いほど、理想なのです。その為のものです。
SQLなのかPHPで出力するプログラムが悪いのか、表示されません。悲しい・・・

投稿日時 - 2008-06-20 00:21:34

ANo.2

2.
基準点と言うのがどう言うものかはわかりませんが、
こちらもカッコが全角の箇所がありますので、
それでエラーになっているのではないでしょうか。

投稿日時 - 2008-06-18 09:36:11

お礼

カッコを半角にしたのですが、だめでした・・・

投稿日時 - 2008-06-20 00:28:24

ANo.1

1.
社会の後のカッコが全角になっています。
それと、国語と社会は''でくくった方がいいと思います。
それと、国語と社会の条件はorで接続した方がいいと思います。
こうなるのかな。
select SUM(点数) as goukei,SUM(点数) - (select SUM(点数) from testdb where 科目='国語' or 科目='社会') as shoukei from testdb

投稿日時 - 2008-06-18 09:33:38

お礼

or の指摘ありがとうございます。

投稿日時 - 2008-06-20 00:29:53