mysql - 显示值的百分比 mysql

标签 mysql

我有如下数据表和数据:

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_nidyear 的平均值:

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/

相关文章:

php - 我怎样才能让我的 3 级层次结构快速加载

mysql - 来自另一个表的 SQL View

php - codeigniter - 在 View 中调用模型函数

mysql - 无法让 mysql_insert_id 工作,无法在任何地方找到答案

MySQL 加载字符串的数据文件

php - 如何让我的 PDO 连接更有效率?

mysql - 通过 if 语句重用 count

php - 选择查询的顺序在准备好的语句中不起作用

python - 使用简单表上的 5600 万条记录加速 SQL 查询

从Windows cmd提示符远程访问MySQL