2011-11-04 139 views
1

我不认为这是可能的,但我想确保。查询过滤

可以说我想让用户的平均年龄假设一些条件。

SELECT avg(age) as avg_a FROM users where something something; 

现在说客户想要得到平均年龄,男性的平均年龄和女性的平均年龄。

所以像

SELECT avg(age) as avg_a, avg(age where female) avg_f, avg(age where male) avg_m FROM users where something something; 

是这样的,甚至可能甚至是否明智?

我该如何去做呢?或者我应该每次运行3个查询?

回答

2

是的,你可以在你的聚合函数中使用case语句。请参阅:

SELECT 
    avg(age) avg_age, 
    avg(case when gender = 'M' then age end) male_avg_age, 
    avg(case when gender = 'F' then age end) female_avg_age 
FROM users; 
+0

啊......太神奇了!谢谢! – guided1

+0

哦,我亲爱的耶稣!它只能在原来的子集上工作! – guided1

0
SELECT 
    avg(age) as avg_a, 
    avg(select age from users where female) avg_f, 
    avg(select age from users where male) avg_m 
FROM users 
WHERE something something; 
+0

我不认为这将具有与主查询相同的where子句吗?这只会对主要查询的子集起作用吗? – guided1

+0

是真的,他还需要添加该子查询。好点 – drdwilcox

0

为了获得每个性别的平均值以及所有平均值,您必须在GROUP BY中使用WITH ROLLUP子句。

例如,这里是一些样本数据:

use junk 
DROP TABLE IF EXISTS people; 
CREATE TABLE people 
(name VARCHAR(20),age INT,gender CHAR(1)); 
INSERT INTO people VALUES 
('rolando' ,46,'M'), 
('pamela' ,40,'F'), 
('carlik' ,23,'M'), 
('javonne' ,22,'M'), 
('dominique',15,'F'), 
('diamond' ,13,'F'); 
SELECT * FROM people; 

这是你需要查询:

SELECT IFNULL(gender,'ALL') gender,AVG(age) average_age 
FROM people GROUP BY gender WITH ROLLUP; 

这里是输出:

mysql> CREATE TABLE people 
    -> (name VARCHAR(20),age INT,gender CHAR(1)); 
Query OK, 0 rows affected (0.08 sec) 

mysql> INSERT INTO people VALUES 
    -> ('rolando' ,46,'M'),('pamela' ,40,'F'), 
    -> ('carlik' ,23,'M'),('javonne' ,22,'M'), 
    -> ('dominique',15,'F'),('diamond' ,13,'F'); 
Query OK, 6 rows affected (0.06 sec) 
Records: 6 Duplicates: 0 Warnings: 0 

mysql> SELECT * FROM people; 
+-----------+------+--------+ 
| name  | age | gender | 
+-----------+------+--------+ 
| rolando | 46 | M  | 
| pamela | 40 | F  | 
| carlik | 23 | M  | 
| javonne | 22 | M  | 
| dominique | 15 | F  | 
| diamond | 13 | F  | 
+-----------+------+--------+ 
6 rows in set (0.00 sec) 

mysql> SELECT IFNULL(gender,'ALL') gender,AVG(age) average_age 
    -> FROM people GROUP BY gender WITH ROLLUP; 
+--------+-------------+ 
| gender | average_age | 
+--------+-------------+ 
| F  |  22.6667 | 
| M  |  30.3333 | 
| ALL |  26.5000 | 
+--------+-------------+ 
3 rows in set, 1 warning (0.00 sec) 

另一个查询风格会已经:

SELECT A.avgage avg_a,F.avgage avg_f,M.avgage avg_m FROM 
(SELECT AVG(age) avgage FROM people) A, 
(SELECT AVG(age) avgage FROM people WHERE gender='F') F, 
(SELECT AVG(age) avgage FROM people WHERE gender='M') M; 

这里是输出:

mysql> SELECT A.avgage avg_a,F.avgage avg_f,M.avgage avg_m FROM 
    -> (SELECT AVG(age) avgage FROM people) A, 
    -> (SELECT AVG(age) avgage FROM people WHERE gender='F') F, 
    -> (SELECT AVG(age) avgage FROM people WHERE gender='M') M; 
+---------+---------+---------+ 
| avg_a | avg_f | avg_m | 
+---------+---------+---------+ 
| 26.5000 | 22.6667 | 30.3333 | 
+---------+---------+---------+ 
1 row in set (0.00 sec) 

试试看!