2012-02-15 132 views
0

我有这样的一个表:MySQL的选择查询值

orderno  insurance 
ABC123  3.00 
ABC123  3.00 
ABC123  3.00 
DEF456  2.00 
DEF456  2.00 

我想要得到的平均保险值的总和为每个唯一的顺序。

例如(3.00+3.00+3.00)/3 + (2.00+2.00)/2

= 5 

我怎样才能做到这一点使用MySQL查询?

回答

2

试试这个:

SELECT SUM(avgIns) AS oAverage 
FROM 
    (SELECT OrderNo, AVG(Insurance) AS avgIns 
    FROM yourTableName 
    GROUP BY OrderNo) iTable 

UPDATE,如果你想限制你的小数位,使用FORMAT

(价值,decimalPlaces)

SELECT FORMAT(SUM(avgIns),2) AS oAverage   -- Returns two decimal places 
FROM 
    (SELECT OrderNo, AVG(Insurance) AS avgIns 
    FROM yourTableName 
    GROUP BY OrderNo) iTable 
+0

感谢您的理解,除了iTable之外,我应该怎么做? – Chris 2012-02-15 02:13:44

+0

@chris'iTable'只是子查询的名称。 – 2012-02-15 02:15:49

+0

派生表和别名...明白了! – Chris 2012-02-15 02:15:53

0
select sum(value) from (
    select sum(insurance)/count(insurance) as value 
    from yourTableName 
    group by insurance 
) temp; 

实例运行在MySQL:

mysql> create table testTable (id int primary key auto_increment, orderno varchar(12), insurance decimal(6, 2)); 
Query OK, 0 rows affected (0.27 sec) 


mysql> insert into testTable (orderno, insurance) values ('ABC123', 3), ('ABC123', 3), ('ABC123', 3), ('DEF456', 2), ('DEF456', 2); 
Query OK, 5 rows affected (0.00 sec) Records: 5 Duplicates: 0 Warnings: 0 


mysql> select * from testTable; 
+----+---------+-----------+ 
| id | orderno | insurance | 
+----+---------+-----------+ 
| 1 | ABC123 |  3.00 | 
| 2 | ABC123 |  3.00 | 
| 3 | ABC123 |  3.00 | 
| 4 | DEF456 |  2.00 | 
| 5 | DEF456 |  2.00 | 
+----+---------+-----------+ 
5 rows in set (0.00 sec) 


mysql> select sum(value) from (  
select sum(insurance)/count(insurance) as value 
from testTable 
group by insurance) temp; 
+------------+ 
| sum(value) | 
+------------+ 
| 5.000000 | 
+------------+ 
1 row in set (0.02 sec) 
+0

这是行不通的。您无法按照使用聚合函数的同一列进行分组。 – Diego 2012-02-15 02:08:39

+0

是的,你可以......但我忘了给临时表一个别名。 – jka6510 2012-02-15 02:15:47