Win XP SP3 MYSQL 5.5で下記の事をおこないたいと思います。

TABLE1
ID,容積
001,1000
001,2000
002,3000
002,4000
003,500
003,200

select ID,sum(容積) from TABLE1 group by 容積

ID,容積
001,3000
002,7000
003,700

となります。ID、容積、に続き、「計算」というフィールドを設けたいです。
計算は下記のイメージです。

ID = 001を例にとると下記の計算を行いたいです。
マイナスではない、一番小さい値を取得して、「計算」フィールドに表示。
int x1 = 10000
int x2 = 8000
int x3 = 500

x1 - 3000 = 7000
x2 - 7000 = 3000
x3 - 700 = -200

マイナスではない一番小さい値を取得したいので、「3000」を計算フィールドで表示。

このような事を全行に対して行いたいと思います。SQL内だけで終わらせたいのですが、どのようにやればよいのでしょうか?

回答の条件
  • 1人5回まで
  • 13歳以上
  • 登録:2012/02/09 09:42:33
  • 終了:2012/02/16 09:45:08

回答(2件)

id:nattow No.1

nattow回答回数102ベストアンサー獲得回数272012/02/09 12:03:29

ポイント100pt

こんな感じでどうでしょうか

select ID, min(C)
  from
    (
    select ID, 10000 - sum(容積) as C from TABLE1 group by ID having 10000 - sum(容積) >= 0
      union
    select ID, 8000 - sum(容積) as C from TABLE1 group by ID having 8000 - sum(容積) >= 0
      union
    select ID, 500 - sum(容積) as C from TABLE1 group by ID having 500 - sum(容積) >= 0
    ) T
group by ID;

先に計算してマイナスでない値だけを抽出した後、min で最低値を拾っています。

id:akaired

ご回答ありがとうございます!さっそく試してみます!!

2012/02/10 21:34:42
id:windofjuly No.2

うぃんど回答回数2625ベストアンサー獲得回数11492012/02/10 15:09:22

ポイント100pt

500,8000,10000の3つではなく、もっと増えたり減ったりするならば、
500,8000,10000を別テーブルにしてしまうという手も考えられますが、
3つ程度ならCASE文で判断させるほうがスッキリすると思いますよ

SELECT ID, sum(`容積`) AS `容積`, 
    (CASE
     WHEN 500 >= sum(`容積`) THEN 500 - sum(`容積`)
     WHEN 8000 >= sum(`容積`) THEN 8000 - sum(`容積`)
     WHEN 10000 >= sum(`容積`) THEN 10000 - sum(`容積`)
     END) AS `計算結果`
FROM TABLE1
GROUP BY ID;

上記のCASE文は下記のような順序で処理されます
1. 合計が500より小さければ500から引き、ここで処理終了
2. 合計が8000より小さければ8000から引き、ここで処理終了
3. 合計が10000より小さければ10000から引き、ここで処理終了
4. どれにも当てはまらなければ結果無し=Null


別の書き方(こっちのほうが理解しやすいかも・・・)

SELECT *,
    (CASE
     WHEN 500 >= `容積` THEN 500 - `容積`
     WHEN 8000 >= `容積` THEN 8000 - `容積`
     WHEN 10000 >= `容積` THEN 10000 - `容積`
     END) AS `計算結果`
FROM (
    SELECT ID, sum(`容積`) AS `容積`, 
    FROM TABLE1
    GROUP BY ID
) T;

上記2つの書き方の違いによる動作速度差は、
データ量や動作環境によりますので、
どちらが速いかは試してみないと判りません

id:akaired

ご回答ありがとうございます!さっそく試してみます!!

2012/02/10 21:35:31
  • id:nattow
    > int x1 = 10000
    > int x2 = 8000
    > int x3 = 500

    この三つの int はどこから出てきたものでしょうか?
    これらを固定値で SQL 内に書くのでなければ SQL だけで完結させることはできませんね・・・

    > ID = 001を例にとると

    とありますが、実際の例には

    > x1 - 3000 = 7000
    > x2 - 7000 = 3000
    > x3 - 700 = -200

    ID = 001 から 003 まですべての値があるようです・・・
  • id:akaired
    質問一部修正です。

    ID = 001を例にとると下記の計算を行いたいです。
    マイナスではない、一番小さい値を取得して、「計算」フィールドに表示。

    例 (1行目)
    int x1 = 10000
    int x2 = 8000
    int x3 = 500

    y1 = x1 - 3000 = 7000
    y2 = x2 - 3000 = 5000
    y3 = x3 - 3000 = -2500
    y2の5000を表示。

    例 (2行目)
    int x1 = 10000
    int x2 = 8000
    int x3 = 500

    y1 = x1 - 7000 = 3000
    y2 = x2 - 7000 = 1000
    y3 = x3 - 7000 = -6500
    y2の1000を表示。

    マイナスではない一番小さい値を取得したいです。

    このような事を全行に対して行いたいと思います。SQL内だけで終わらせたいのですが、どのようにやればよいのでしょうか?
  • id:akaired
    nattowさん
    ご回答ありがとうございます。質問が間違っていましたので修正しました。intの値は固定値です。
    SQL内で完結できなさそうですか・・・ストアドプロシージャなどでできるかなと思ったのですが、
    ストアドは全くわからないので質問させて頂きました。
  • id:nattow
    固定値を SQL に直接埋め込む形での記述例を回答しましたのでご確認ください。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません