2016-08-11 3 views
0

PostgreSQL У меня есть три таблицы, как показано нижеSUM из двух групп уровня по в

студент

id name stand_id sub_id gender 
--------------------------------------- 
1 | Joe | 1  |  1  |  M 
2 | Saun | 2  |  1  |  F 
3 | Paul | 1  |  2  |  F 
4 | Sena | 2  |  2  |  M 

Тема

id name    
1 Math    
2 English       

Стандартный

id name    
1 First   
2 Second   

Как я могу достичь такого рода множественной группы, как стандартное, предметное, чем общее количество мальчиков и девочек.

Должен ли я использовать, объединить или объединить все?

First 
Math 
boys  total 
girls  total 

second 
math 
boys  total 
girls  total 

ответ

0

Непонятно, что вы пытаетесь сделать. Моя интерпретация заключается в том, что вы ищете общее число учащихся по standard, subject и gender.

Если это правильно, вы должны объединяться таблицы и подсчет студентов в соответствующее зерно, например, так:

SELECT 
    sta.name AS standard_name, 
    sub.name AS subject_name, 
    CASE stu.gender WHEN 'M' THEN 'Boys' ELSE 'Girls' END AS student_gender, 
    COUNT(stu.id) AS total 
FROM 
    student stu 
JOIN 
    subject sub 
    ON (stu.sub_id = sub.id) 
JOIN 
    standard sta 
    ON (stu.stand_id = sta.id) 
GROUP BY 
    standard_name, 
    subject_name, 
    student_gender; 

на основе данных выборки, это вернуть бы это:

standard_name | subject_name | student_gender | total 
----------------------------------------------------- 
First  | Math   | Boys   | 1 
First  | English  | Girls   | 1 
Second  | Math   | Girls   | 1 
Second  | English  | Boys   | 1 
0

это то, что вы ищете

SELECT sd.name, 
     sj.name, 
     count(st.gender) filter (
           WHERE st.gender='M') AS MALE, 
     count(st.gender) filter (
           WHERE st.gender='F') AS FEMALE 
FROM Standard sd 
INNER JOIN Student st ON (st.stand_id=sd.id) 
INNER JOIN Subject sj ON (sj.id=st.sub_id) 
GROUP BY sd.name, 
     sj.name; 

    name | name | male | female 
--------+---------+------+-------- 
First | Math | 1 |  0 
First | English | 0 |  1 
Second | English | 2 |  1 
Second | Math | 0 |  1 
(4 rows) 

Я добавил еще несколько строк второй En сский.