我有如下数据表和数据:
mysql> describe school_data_sets_numeric_data;
+--------------+----------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------------+----------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| data_set_nid | int(11) | NO | | NULL | |
| school_nid | int(11) | NO | | NULL | |
| year | int(11) | NO | | NULL | |
| description | varchar(255) | NO | | NULL | |
| value | decimal(18,12) | NO | | NULL | |
+--------------+----------------+------+-----+---------+----------------+
6 rows in set (0.00 sec)
+----+--------------+------------+------+-------------------+------------------+
| id | data_set_nid | school_nid | year | description | value |
+----+--------------+------------+------+-------------------+------------------+
| 54 | 19951 | 19944 | 2008 | Asian | 75.000000000000 |
| 51 | 19951 | 19944 | 2008 | White | 200.000000000000 |
| 52 | 19951 | 19944 | 2008 | African American | 100.000000000000 |
| 53 | 19951 | 19944 | 2008 | Hispanic | 50.000000000000 |
| 55 | 19951 | 19944 | 2008 | Native American | 9.000000000000 |
我想显示数据的平均值而不是原始数字。我想在原始 sql 中执行此操作。
例子:
+----+--------------+------------+------+-------------------+------------------+
| id | data_set_nid | school_nid | year | description | average |
+----+--------------+------------+------+-------------------+------------------+
| 54 | 19951 | 19944 | 2008 | Asian | 17.28% |
| 51 | 19951 | 19944 | 2008 | White | 46.06% |
| 52 | 19951 | 19944 | 2008 | African American | 23.04% |
| 53 | 19951 | 19944 | 2008 | Hispanic | 11.52% |
| 55 | 19951 | 19944 | 2008 | Native American | 2.07% |
最好的方法是什么?请记住,会有多个数据集和年份。
最佳答案
执行此操作的一种方法是编写一个获取“总值”的查询,这将是您的平均值的分母。
SELECT SUM(value) AS total_value FROM school_data_sets_numeric_data
将该查询的结果与表的每一行连接起来,这样您就可以获得可用的值和总数,您可以使用它们来计算平均值。
SELECT v.id
, v.data_set_nid
, v.school_nid
, v.year
, v.description
-- , v.value
-- , t.total_value
, CONCAT(FORMAT(IF(t.total_value=0,0,(v.value*100.0)/t.total_value),2),'%')
AS `average`
FROM (SELECT SUM(value) AS total_value FROM school_data_sets_numeric_data) t
CROSS
JOIN school_data_sets_numeric_data v
关键字 CROSS
是可选的,但它作为文档供后来的审阅者使用,并让他们知道我们打算创建笛卡尔积,并且我们有意遗漏了这一点(并非意外)省略)一个用于 JOIN 的 ON
子句。
返回“平均值”的表达式,显示您显示的值...四舍五入到小数点后两位,尾随百分号。
计算“平均值”很简单……value/total_value * 100
。
(如果分子和恶魔都是整数类型,请注意“整数”除法,这在您的情况下不是问题,但我们通过乘以十进制文字确保分子是十进制,这确保我们有十进制类型值。)
表达式的其余部分用于避免可能的“被零除”异常、四舍五入到两位小数、格式化两位固定小数位并附加“%”。
如果您希望这些 % 符号对齐,您可以在该字符串的左侧填充空格,以达到特定的长度,例如LPAD(expr,7,' ')
。 (实际上,我可能会在添加 %' 的 CONCAT 之前这样做,但这并不重要。)
如果您打算对一个子集(例如,特定年份和特定数据集)而不是整个返回集进行平均,那么我们会得到每组数据的“小计”。
在这里,我们计算特定 data_set_nid
和 year
的平均值:
SELECT v.id
, v.data_set_nid
, v.school_nid
, v.year
, v.description
-- , v.value
-- , t.total_value
, CONCAT(FORMAT(IF(t.total_value=0,0,(v.value*100.0)/t.total_value),2),'%')
AS `average`
FROM (SELECT u.data_set_nid
, u.year
, SUM(u.value) AS total_value
FROM school_data_sets_numeric_data u
GROUP
BY u.data_set_nid
, u.year
) t
JOIN school_data_sets_numeric_data v
ON v.data_set_nid = t.data_set_nid
, v.year = t.year
关于mysql - 显示值的百分比 mysql,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11906840/