人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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内だけで終わらせたいのですが、どのようにやればよいのでしょうか?


●質問者: akaired
●カテゴリ:コンピュータ
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● nattow
●100ポイント

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

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 で最低値を拾っています。


akairedさんのコメント
ご回答ありがとうございます!さっそく試してみます!!

2 ● うぃんど
●100ポイント

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つの書き方の違いによる動作速度差は、
データ量や動作環境によりますので、
どちらが速いかは試してみないと判りません


akairedさんのコメント
ご回答ありがとうございます!さっそく試してみます!!
関連質問

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ