2015-05-08 3 views
1

Например, у меня есть таблица, представляющая всех учителей в моей школе, включая его/ее имя, пол и класс, которым он принадлежит. Я хочу знать, для каждого класса, сколько мужчин и сколько учителей-женщин в SQL-заявлении.Oracle Count in Group

Abosolutely, каждый учитель может принадлежать только одному классу!

COLUMN TYPE  DESCRIPTION 
CLASS NUMBER  the class number,e.g. 0,1,2,3 ... 
SEX  NUMBER  teacher sex, 0 represents male and 1 represents female. 
TEACHER VARCHAR teacher name like Lily,Lucy 

Более глубокий:

У меня есть таблица представляет все учителя в моей школе, включая его/ее имя, возраст и класс, он/она принадлежит to.I хочет знать, для каждого класса, сколько учителей моложе 20 лет и сколько учителей старше, чем 20 в то же время в SQL-заявлении.

COLUMN TYPE  DESCRIPTION 
CLASS NUMBER  the class number,e.g. 0,1,2,3 ... 
AGE  NUMBER  teacher ages. 
TEACHER VARCHAR teacher name like Lily,Lucy 
+4

Добавить определения таблицы, данные примеры, ожидаемый результат и ваш текущий запрос! (Помогите нам помочь!) – jarlh

+0

Извините за это. – wuchang

+0

Может ли учитель относиться только к одному классу? Если нет, я бы сказал, что вам нужна другая таблица для хранения комбинаций учителей/классов. – jarlh

ответ

0

Группа по классу и полу

SELECT CLASS, COUNT(SEX) 
FROM TeacherTable 
GROUP BY CLASS, SEX 

SQL FIDDLE: http://sqlfiddle.com/#!4/60ddc/10/0

+0

Как этот запрос даст - для каждого класса, сколько учителей-мужчин и сколько учителей-женщин – Rajesh

+0

Потому что он группирует по классу И сексу, добавляет SQL FIDDLE output – Matt

+0

Я видел результат запроса, но как вы поймете, кто из них Мужской, Женский. – Rajesh

1
SELECT CLASS, 
     COUNT(DECODE(SEX,'0','MALE')) AS MALE_TEACHERS, 
     COUNT(DECODE(SEX,'1','FEMALE')) AS FEMALE_TEACHERS, 
     COUNT(CASE WHEN AGE < 20 THEN 1 ELSE NULL END) AS "<20", 
     COUNT(CASE WHEN AGE >= 20 THEN 1 ELSE NULL END) AS ">20" 
FROM YOURTABLE 
GROUP BY CLASS 
+0

Запрос должен быть изменен для обработки возраста = 20 совпадений [CASE КОГДА ВОЗРАСТ] = 20 ТОГДА 1 ELSE NULL END] – Rajesh

1

Попробуйте это:

SELECT CLASS, SUM(MALE) AS MALE, SUM(FEMALE) AS FEMALE, 
SUM(YOUNGER) AS YOUNGER, SUM(OLDER) AS OLDER 
FROM(
SELECT CLASS, 
(CASE WHEN SEX = 0 THEN 1 ELSE 0 END) AS MALE, 
(CASE WHEN SEX = 1 THEN 1 ELSE 0 END) AS FEMALE, 
(CASE WHEN AGE < 20 THEN 1 ELSE 0 END) AS YOUNGER, 
(CASE WHEN AGE >= 20 THEN 1 ELSE 0 END) AS OLDER 
FROM YOURTABLE 
) AS T 
GROUP BY CLASS 
0

Попробуйте это ....

CREATE TABLE #Class 
    ([Class] int,[sex] bit) 
; 

INSERT INTO #Class 
    ([Class], [sex]) 
VALUES 
    (1, 1), 
    (1,1), 
    (1,0), 
    (1,0), 
    (2,0), 
    (2,0), 
    (2,1), 
    (2,1), 
    (2,1), 
    (1,1) 
; 


select class, case when sex = 0 then 'male' else 'Female' End as sex ,Count(Sex) as count1 from #Class group by class,sex 
--drop table #Class 
+0

Ваша установка образца неверна для Oracle. –

0

Вы можете использовать CASE/DECODE дифференцировать пол и GROUP BY, чтобы получить количество.

Настройка

SQL> CREATE TABLE t 
    2  (class number, sex number, teacher varchar2(1)); 

Table created. 

SQL> INSERT ALL 
    2  INTO t (class, sex, teacher) 
    3   VALUES (1, 1, 'a') 
    4  INTO t (class, sex, teacher) 
    5   VALUES (1, 0, 'b') 
    6  INTO t (class, sex, teacher) 
    7   VALUES (1, 0, 'c') 
    8  INTO t (class, sex, teacher) 
    9   VALUES (2, 1, 'd') 
10  INTO t (class, sex, teacher) 
11   VALUES (2, 1, 'e') 
12  INTO t (class, sex, teacher) 
13   VALUES (2, 0, 'f') 
14 SELECT * FROM dual; 

6 rows created. 

SQL> SELECT * FROM t; 

    CLASS  SEX T 
---------- ---------- - 
     1   1 a 
     1   0 b 
     1   0 c 
     2   1 d 
     2   1 e 
     2   0 f 

6 rows selected. 

Запрос

SQL> SELECT class, 
    2 CASE 
    3  WHEN sex = 0 
    4  THEN 'male' 
    5  ELSE 'Female' 
    6 END AS sex, 
    7 COUNT(sex) 
    8 FROM t 
    9 GROUP BY CLASS, 
10 sex 
11 ORDER BY class; 

    CLASS SEX COUNT(SEX) 
---------- ------ ---------- 
     1 male   2 
     1 Female   1 
     2 male   1 
     2 Female   2