アプリ版:「スタンプのみでお礼する」機能のリリースについて

わり算の結果が整数でも小数点以下4桁まで表示されてしまう!

同じような質問で恐縮なのですが、
例えば、100、101というデータをMySQLの算術演算子/を使って2で割ると、
50.0000、50.5000のように、整数だろうが小数だろうが、小数点以下4桁まで出てしまいます。
これを、いろんな関数を駆使して50、50.5にすることはできますか。
50、51または50.0、50.5のように小数点の位置を同じずつ動かすことはできるのですが、これでは嫌だなぁと思った次第です

A 回答 (4件)

いまさらだけどちょっと思いついたので・・・


テンポラリテーブルに一度格納してから表示してみては?

CREATE TEMPORARY TABLE TEMP(STR VARCHAR(100),NUM DOUBLE);
INSERT INTO TEMP SELECT '100/2',100/2;
INSERT INTO TEMP SELECT '101/2',101/2;
SELECT * FROM TEMP;
    • good
    • 0
この回答へのお礼

こんにちは!

テンポラリテーブルというのがあるのですね。
ここに、わり算の結果を挿入すると、有効桁数に関わらず、自然な数字になるように0が切り捨てられるのですね。
mysqlを終了するとテーブルも、きれいさっぱり消えてクリーンですね。

私の環境だとシェルからmysqlを実行した場合、日本語混じりのテーブルがずれて見づらいので、
CGIを介してブラウザからSELECT文を送信して、結果セットをびゃーっと表示する、へぼツールを作りました。
何がへぼかというと、SQLを発行するたびに、別のセッションとなってしまうことです。
テンポラリテーブルを作成するためにCREATE文を発行すると、ブラウザにテーブルが無事作成できたことを通知する文章が表示されると同時にテーブルは抹消されるのでした。

そういうわけでして、
私は、長くて見栄えの悪いSQLであっても1個のSQLで、ばーんと出来る方法を探し求めてしまうのかも

お礼日時:2010/07/13 07:00

なぜ、そんな部分にこだわって、冗長で分かりづらいことをしたいのか理解に苦しみますが。


「個人的なチョットしたテストのためだけ」ということでしょうか?

簡単な方法としては、CAST関数でDECやDEC(m,n)として、今よりは見やすくはできると思いますけど?

>第三に、SQLで実現可能なことは、極力SQLで実現し、SQLで不可能なことのみ、独自プロ
>グラム中で実現すべきである(という記事を読んだことがある)。

どんな記事を参考にしたのか知りませんが、専門的なサイトや雑誌の記事であれば、記事の内容を誤解していると思いますよ?
「SQLでこんなこともできる」という話と、では実際にシステム開発する場合に、「そういったSQLを書いていいか」という話は、まったく次元の違う話です。

>おそらく自作プログラム中でループ処理を行うよりも、MySQLにやってもらった方が高速
>なのだと思います。

恐らく、ストアドプロシジャか何かの記事を読んだのでしょうかね?

RDBMSのオプティマイザは、より最適なアクセス計画を作るため、技術者が苦心して複雑な処理を組み込んでいます。商用RDBMSなどではバージョンアップを重ね、かなり賢くなってきています。MySQLでは、サブクエリなど、まだまだ他のオープンソースのRDBMSと比べても見劣りする部分が少なくありません。
今回、冗長な編集をSQLで実装しようとしているのは、一番外側のSELECT句でだけでしょうかね?それだけであればまだいいのですが、これを検索条件などでやり始めたら、性能などはまったく出せないものになります。
つまり、DB操作に直接関係しない部分を、SQLでわざわざ処理させるようなことは、高性能を出すように工夫しているRDBMSに、無駄な処理をさせることになります。

>やる必要があったので質問に参ったわけです。
>今回もまた、簡単に実現できる方法がないか先生方に聞きに来たのであります。

先生って。。。
ここは、他人が善意のボランティアでアドバイスしてくれているのであり、
「なぜそんなことをやる必要が生じているのか?」
「もっと適切なことができるのに、知らなかったり、何らかの誤解があるのではないか?」
といったように、解決策のヒントになればと、#2さんも、より親切に接してくれている訳です。
    • good
    • 0
この回答へのお礼

こんにちは

今回は「個人的なチョットしたテストのためだけ」の目的で質問しました。

目的のテストはNo.1のお礼欄へ記した式を用いて、すでに完了しているため、
本スレの目的は情報収集へと移行しつつありますが

質問内容を再度記載すると、わり算の結果を、有効桁数いっぱいまで0を付けずに表示したいというものです。
すなわち次のデータ
0.1234
1.2340
2.3400
3.4000
4.0000
を次のように表示させたいというものです。
0.1234
1.234
2.34
3.4
4

CAST関数でDECやDEC(m,n)とする方法は、データ内容に関わらず、小数点以下桁数を全て同じにするだけなので、これでは嫌だなぁと思った次第です。

MySQLに関する興味深い話題をありがとうございます。
私が参考にした記事は、たしか新人研修で読まされたSQLの入門書だったと思います。

MySQLはオープンソースでは最強のDBと信じていたのですが、まだまだ私の知らない、すごいDBがあるのですね。
そんなchukenkenkouさん一押しのRDBは何ですか?

ここは、私の知らないことを知っている人たちがいっぱいいるので敬意を込めて先生と呼んでしまいました。
思えば学校を卒業してから久しく使っていなかった単語だなぁ

お礼日時:2010/07/03 09:32

前回の桁数合わせのときにもちょっと書きましたが、基本的な考え方が間違っています。


MySQLが出してくれるのは有効桁数をもった数値です。
重要なのは4桁までしか有効に計算してくれないということだけで、逆に0が表示しないと
何桁までが有効かわからなくなります。

これはdouble値の割り算のとき何桁まできちんと計算するかを指定しておいて
無駄な計算をしないための知恵です

くわしくは
http://dev.mysql.com/doc/refman/5.1/ja/server-sy …

実際の運用上はSQLというものはミドルウェアに表示を依存します。
そこで小数点以下をどう表示するかを調整すればいいでしょう。

>いろんな関数を駆使して50、50.5にすることはできますか。

やろうと思えばやれるでしょうけど、やる必要はないし、そこにこだわってるうちは
SQLは上達する見込みはありません
    • good
    • 1
この回答へのお礼

こんにちは。

div_precision_incrementを使って小数点以下桁数を0桁にできました。

有効桁数を把握するために、整数であっても、小数点以下に0000が付くという、ごもっともなご回答に対する私の反論としては、
今回のケースでは表示された値を単純に目で検査するので、0000が邪魔だなぁと思った次第です。

また、本来はミドルウェア中で小数点以下桁数を調整すべきという方針に対しての、反論ですが、
第一にミドルウェアを作る能力がない。
第二に、私の場合、ちょっとしたテスト用にミドルウェアを介さず、すぐにSQLを実行したい場合が、結構ある。
第三に、SQLで実現可能なことは、極力SQLで実現し、SQLで不可能なことのみ、独自プログラム中で実現すべきである(という記事を読んだことがある)。
おそらく自作プログラム中でループ処理を行うよりも、MySQLにやってもらった方が高速なのだと思います。

そして、最後の意見についても、反論します。
やる必要があったので質問に参ったわけです。
SQLに、こだわればSQLが上達するし、こだわらなければ逆にSQL以外のプログラミングが上達します。

そういう私はSQLマスターになる夢は、すでにあきらめており、今回もまた、簡単に実現できる方法がないか先生方に聞きに来たのであります。

お礼日時:2010/06/28 14:48

MySQLのバージョンを、MySQL 4.0、4.1、5.0といったレベルまでは最低限、提示するようにしてください。

大きな機能拡張以外に、一部の仕様変更があります。

列のデータ型、定数ならその指定、実際の算術演算式を、正確に提示してください。
それらの組み合わせで、MySQLが演算の中間結果や最終的な結果のデータ型を決定します。

データ型は、dec(n,4)とかでしょうかね?
ZEROFILLの指定は、してたりしますか?
    • good
    • 0
この回答へのお礼

こんにちは!

MySQLは5.0でした。
yumを覚えたので最新にもできます(すでに最新かな)

データ型はTINYINT、SMALLINT等です
ZEROFILL指定はなしです

今回のケースでは、欲しい値は、
`列` / 2
なので返される値の小数点以下に注目すると、'.0000'、または、'.5000'の2通りしかない事に気づき、次の式で対応しました。

IF(`列` / 2 LIKE '%.0%', `列` DIV 2, TRUNCATE(`列` / 2, 1))

これにより、100、101というデータは50、50.5になりました。

今回は、たまたま、この式で対応できましたが、
2で割る時専用の、貧弱な式です・・・

お礼日時:2010/06/25 17:02

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