【问题标题】:MYSQL: SELECT concat('$ ', SUM(`sale_price`)) gives a random valueMYSQL:SELECT concat('$', SUM(`sale_price`)) 给出一个随机值
【发布时间】:2016-04-01 07:44:45
【问题描述】:

在 MYSQL 中:

SELECT 语句 ...

SELECT concat('$ ', SUM(`sale_price`) ) FROM `temp_table`

... 给出一个随机输出值,而 ...

SELECT concat('$ ', FORMAT(SUM(`sale_price`), 2)) FROM `temp_table` 

...给出正确的输出。

为什么会这样?第一条语句有什么问题?

这是我尝试这些语句的表的 SQL 代码。

SQL 代码:

-- phpMyAdmin SQL Dump
-- version 4.2.11
-- http://www.phpmyadmin.net
--
-- Host: 127.0.0.1
-- Generation Time: Apr 01, 2016 at 11:04 AM
-- Server version: 5.6.21
-- PHP Version: 5.6.3

SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
SET time_zone = "+00:00";


/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;

--
-- Database: `book_shop`
--

-- --------------------------------------------------------

--
-- Table structure for table `temp_table`
--

CREATE TABLE IF NOT EXISTS `temp_table` (
`sale_price` decimal(8,2) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

--
-- Dumping data for table `temp_table`
--

INSERT INTO `temp_table` (`sale_price`) VALUES
('21.20'),
('46.80'),
('23.50'),
('54.70');

/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;

【问题讨论】:

标签: mysql currency money-format


【解决方案1】:
SELECT concat('$ ', SUM(`sale_price`) ) FROM `transactions`

...和...

SELECT concat('$ ', FORMAT(SUM(sale_price), 2)) FROM `transactions`

... 做同样的事情,只有FORMAT(... , 2) 确保您的销售价格格式为小数,在. 后面加两位数(这是人与人之间交易中通常用于货币价值的格式)。

没有FORMAT(... , 2),您的销售价格格式取决于您在数据库中的销售价格格式。


注 1

当我尝试...

SELECT concat('$ ', SUM(sale_price)) FROM test

...在包含21.2046.8023.5054.70sale_price 的测试表上,我得到以下输出:

  • $ 146.20000076293945 如果我使用 FLOAT
  • $ 146.20 如果我使用类似 DECIMAL(10,2) 的东西

这是两种情况下的预期结果。如您所见,FLOAT 不太精确,因此应避免使用。


注2

根据以下 cmets 中提供的信息,您的 PHPMyAdmin 安装似乎有问题。请卸载并重新安装它(最好是不同的版本)。

【讨论】:

  • 只有第二个语句给出了正确的输出,在我的例子中是:$ 34,577.80 对于第一个语句,输出是 e 的幂的一个巨大数字,但不是 '$ 34,577.80'!
  • @shiv :您的第一个语句得到的确切输出是什么?此外,您是否知道数据库中用于该总和的各个销售价格?如果您希望我们更具体,您需要向我们提供更多信息!
  • 好的。让我们简化一下,因为事务表有超过 8000 行。我创建了一个名为temp_table 的表。它有一个名为sale_price 的列。该表有四行,sale_price 的值为 21.20、46.80、23.50 和 54.70。语句 1:SELECT concat('$', SUM(sale_price)) FROM temp_table 输出:24203134362e3230 语句 2:SELECT concat('$', FORMAT(SUM(sale_price),2)) FROM temp_table输出:$ 146.20
  • @shiv :您的sales_price 列使用什么数据类型?当我在测试表上尝试SELECT concat('$ ', SUM(sale_price)) FROM test 时,如果我使用FLOAT和 (2) $ 146.20 如果我使用 DECIMAL(10,2)... 这是两种情况下的预期结果! — 注意:您应该始终使用小数来存储货币值
  • sale_price的数据类型是十进制(8,2)。
猜你喜欢
  • 2016-05-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多