2011-11-04 3 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

Ahhh ... 훌륭하다! 감사! – 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

기본 쿼리와 동일한 절이 있다고 생각하지 않습니까? 그것은 기본 쿼리의 하위 집합에서만 작동합니까? – guided1

+0

사실이면 하위 쿼리도 추가해야합니다. 좋은 점 – drdwilcox

0

을 당신이 GROUP BY에서 롤업 WITH 절을 사용해야합니다 모든 성 당 평균 및 평균을 얻기 위하여. 출력 여기

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) 

또 다른 질의 스타일이 것

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; 

이 필요한 쿼리는 다음과 같습니다

예를 들어

는 여기에 몇 가지 샘플 데이터입니다 있었 :

여기

는 출력 :

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) 

그것을 시도 줄!