【问题标题】:MySQL cast to decimal (5,2) does still return 0MySQL 转换为十进制 (5,2) 仍然返回 0
【发布时间】:2020-06-18 09:47:46
【问题描述】:

我正在尝试在此处的客户表中获取德国客户的百分比: https://www.w3schools.com/sql/trysql.asp?filename=trysql_select_all

我正在使用这个查询:

SELECT cast((cast((SELECT COUNT(*) FROM Customers WHERE Country = "Germany") as DECIMAL(5,2))/cast((SELECT COUNT(*) FROM Customers) as DECIMAL(5,2))) AS DECIMAL(5,2)) AS PercentageGermans;

由于某种原因,我仍然返回 0,尽管将终端的所有成分转换为十进制 5,2。

我已经在该主题上搜索了 SO 并找到了这个答案: https://stackoverflow.com/a/26537471/8732285

在这里,我正在尝试做的演员表几乎和我做的一样:

cast((select count(random_int) from test) as decimal(7,2))

演员表被应用于完整的子查询。它在那里工作,也可以在小提琴上看到: http://sqlfiddle.com/#!15/63252/37

但我不明白我的情况出了什么问题。

【问题讨论】:

  • 我没有收到0。我得到An unspecified error occurred. 这可能是因为您引用了Germany 错误,并且系统正在寻找具有该名称的列,而不是字符串?除非 MySQL 默认允许使用双引号。或者它可能是其他的东西。无论如何,您引用的代码不会产生您在您引用的网站上引用的错误,因此请仔细检查您是否在所有情况下都发布了最新信息。
  • @underscore_d 这很奇怪,当我复制粘贴查询时,我仍然得到 0,而不是 unspec 错误。Oo

标签: mysql sql select group-by average


【解决方案1】:

我正在尝试获取客户表中德国客户的百分比。

我认为你在夸大其词。我只想将您的查询表述为:

select avg(country = 'Germany') ratio_germans from customers

这会为您提供介于 01 之间的值,它代表德国客户的比例。您可以通过将其乘以 100 将其转换为百分比。假设您想要一个具有 2 位小数的百分比,那么:

select round(avg(country = 'Germany') * 100, 2) percent_germans from customers

【讨论】:

  • 哇,这很有趣,谢谢!我认为 AVG() 用于计算数值数据类型(int,double)的列?我的意思是,这里 mysql 基本上必须猜测我想将匹配参数内部条件的行数除以表上的所有行数。见鬼,我找不到有关此行为的任何文档 Oo dev.mysql.com/doc/refman/8.0/en/… 这是指定的行为吗?我的意思是,我什至不知道您可以将条件放入参数中。我以为它只需要一个列的名称 Oo
  • 我的猜测是它将该条件的平均值作为布尔值 0 或 1。因此,对于每一行,计算为 0 或 1,然后取其平均值,这将是0 和 1。我对布尔和数字类型之间的这种隐式转换有点内疚,并且经常发现自己在 T-SQL 中错过了它。
猜你喜欢
  • 2014-12-15
  • 2020-03-28
  • 1970-01-01
  • 2016-12-25
  • 2015-10-07
  • 1970-01-01
  • 2014-04-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多