6

我有以下数据表和数据:

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%           |

做这个的最好方式是什么?请记住,会有多个数据集和年份。

4

3 回答 3

9

一种方法是编写一个获取“总值”的查询,这将是您的平均值的分母。

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是可选的,但它可以作为后续审阅者的文档,并让他们知道我们打算创建笛卡尔积,并且我们故意省略(并且不是意外省略)ONJOIN 的子句。

返回“平均值”的表达式会显示您显示的值...四舍五入到两位小数,尾随百分号。

计算“平均值”很简单 value / total_value * 100......

(如果分子和恶魔都是整数类型,请注意“整数”除法,这在您的情况下不是问题,但我们通过乘以十进制文字来确保分子是十进制,这确保我们有十进制类型值。)

表达式的其余部分处理避免可能的“除以零”异常,四舍五入到两位小数,格式化两位固定小数位,并附加“%”。

如果您希望这些 % 符号对齐,您可以在该字符串的左侧用空格填充特定长度,例如LPAD(expr,7,' '). (实际上,我可能会在添加 %' 的 CONCAT 之前这样做,但这并不重要。)


如果您打算对子集(例如,特定年份和特定数据集)而不是整个回报集进行平均,那么我们将获得这些数据组中的每一个的“小计”。

在这里,我们从一个特定的data_set_nidand计算平均值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
于 2012-08-10T18:15:20.243 回答
3

尝试这个。

select @total:=sum(value) from school_data_sets_numeric_data;

select  id, data_set_nid, school_nid, year, description,
concat(round((100*actor_id)/@total,2),"%") as percentage 
from school_data_sets_numeric_data;

输入将是这样的

于 2012-08-10T18:19:10.940 回答
0

试试下面的。在sqlfidlle上测试。

select id, data_set_nid,school_nid, year, description, round(value/(select sum(value) from school_data_sets_numeric_data)*100,2) as average from school_data_sets_numeric_data
于 2012-08-10T18:02:03.080 回答