ショボ短歌会

create table table1(id int,合計 int,目標 int,実績 double);
とした時に、実績を一発で出したい。

実績は、(過去の合計の累計/過去の目標の累計) * 100で求める。
例えば例として下記の様になります。
id 合計 合計の累計 目標 目標の累計 実績
1 2 2 3 3 66.67
2 1 3 3 6 50.00
3 1 4 3 9 44.44
4 2 6 3 12 50.00
5 1 7 3 15 46.67
6 1 8 3 18 44.44
7 2 10 3 21 47.62

現在は、一発では出来ないので個々に個別で求めています。
1. 合計の累計を出す
2. 目標の累計を出す
3. 実績を出す

ここでは、実績だけあれば良いので合計の累計とか目標の累計も本来は
不要ですが。実績の出し方が分からないのでテーブルにフィールドを入
れています。

これをテーブルに一括してidと合計と目標だけで実績を保存をすると言
う事は出来るのでしょうか。

宜しく回答をお願いします。

質問者からの補足コメント

  • うーん・・・

    sqlは出来れば、この場合はテーブルにidと合計と目標が保存されていますので
    実績を出す更新クエリーのupdateでお願いします。
    update table1 set 実績=....

    宜しくお願いします。

      補足日時:2016/02/19 08:46
  • うーん・・・

    updateを使ってテーブルに保存する理由は、
    このデータを使って次の工程でグラフを作るからです。

    その為にはどうしてもデータとしての保存が必要です。
    宜しくお願いします。

      補足日時:2016/02/19 09:28

A 回答 (2件)

>dummyと言うのはたんなるaliasでしょうか。



FROM句にサブクエリを実行するときにはalias名が必要なのはMySQLの仕様です
https://dev.mysql.com/doc/refman/5.6/ja/from-cla …

正直dummyでもhogeでもなんでもいいです。
なにか別名がついていればいいという仕様です
実質この場合のalias名は利用されていないし、競合することはありません

気になるならユニークなalias名を指定してください

例)
SELET内のサブクエリにaliasは不要、ただし付けないと参照しづらい
SELECT (SELECT 1);

WHERE句もリレーションしなければalias不要
SELECT 1 FROM (SELECT 1) AS DUMMY WHERE 1=(SELECT 1);

FROM句は常にaliasが必要
SELECT * FROM (SELECT 1); →×
SELECT * FROM (SELECT 1) AS DUMMY; →○
    • good
    • 0
この回答へのお礼

有難う御座います。

奥が深い。未だ、私は日が浅いので面くらう事が多いです。
大変、勉強になりました。

有難う御座います。

お礼日時:2016/02/19 12:06

見た目上の順番は意味がないのでかならずid順で累計をだすために


order byを指定してupdateする必要があります。
今回のケースであれば変数を二つ使ってまわせばよいでしょう

//元データ
create table table1(id int not null primary key,合計 int not null,目標 int not null,実績 double not null);
insert into table1(id,合計,目標) values(1,2,3),(2,1,3),(3,1,3),(4,2,3),(5,1,3),(6,1,3),(7,2,3);

//実行SQL
set @a=0,@b=0;
update table1 set 実績=(@a:=@a+合計)/(@b:=@b+目標)*100 order by id asc;

//上記を一発でやる場合はダミーのサブクエリを実行する
update table1 set 実績=(select @a:=@a+合計 from (select @a:=0) as dummy)/(select @b:=@b+目標 from (select @b:=0) as dummy)*100 order by id asc;
    • good
    • 0
この回答へのお礼

一発でやると言うのは、分母も分子も双方に同じdummyを
使っていますが。これはぶつかりあってエラーになると言う事は
無いのでしょうか。

実際は、動かして見ると正常に動くのですが。

この場合のdummyと言うのは変数では無いと思いますが。
@aとか@bは変数ですが。dummyと変数の違いは何なんでしょうか

dummyと言うのはたんなるaliasでしょうか。
それは、フィールドの名前と言う事だとしたらfrom句に限っては
同じ名前でも支障は無いと言う事でしょうか。

dummyの使い方と言うのが良く分かりません。どう言う場合に同じ名前でも
問題にならないのかと言うあたりです。

宜しく回答お願いします。

お礼日時:2016/02/19 10:49

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

関連するカテゴリからQ&Aを探す