MySQL - как сохранить функцию count() от сбрасывания 0 счетчиков?

Я новичок в mySQL и работаю над запросом, который по существу берет одну исходную таблицу и суммирует ее содержимое в двух отдельных таблицах. Вторая "сводная" таблица отбрасывает кортежи, где значение равно 0; Мне нужно это исправить. Вот специфика:

У меня есть большой инвентарный стол, который я собираю из других таблиц:

SID  CID   SECTION  RATING
==========================
100  1001  1        A
101  1001  1        A
102  1002  1        B
103  1002  2        F
104  1003  1        A
...etc...

("CID" и "Section" являются первичными ключами здесь, я не знаю, является ли значение PK распределенным по двум атрибутам здесь.) У меня есть успешный запрос ("numTable1"), который подсчитывает количество SID для каждый CID и раздел. Например, в приведенной выше таблице инвентаризации "sumTable1" будет:

CID   SECTION  numSID
=====================
1001  1        2
1002  1        1
1002  2        1
1003  1        1
...etc...

Вот SQL:

create temporary table numTable1(
    SELECT ot1.cid, ot2.section, count(ot1.sid) 'numSID'
    FROM otherTable1 ot1, otherTable2 ot2
    WHERE ot1.cid=ot2.cid and ot1.section=ot2.section
    GROUP BY ot1.cid, ot2.section
);

"NumTable" прекрасно работает. Вот проблема: мне также нужен запрос, который подсчитывает количество оценок "А" на CID/ раздел:

create temporary table numA(
    select t9.cid, t9.section, count(ot1.rating) 'As'
    from otherTable1 ot1, t9
    where grade = 'A' and t9.cid=ot1.cid and t9.section=ot1.section
    group by t9.cid, t9.section

);

Вот вывод "numA":

CID   SECTION  As
=====================
1001  1        2
1003  1        1
...etc...

Но вот проблема; некоторые CID/ разделы не имеют рейтинга A, и они вымываются. Что мне нужно, это:

CID   SECTION  As
=====================
1001  1        2
1002  1        0
1002  2        0
1003  1        1
...etc...

Вы заметите, что приведенная выше таблица может быть легко объединена с "numTable1", что является конечной целью здесь:

CID   SECTION  numSID   As
==========================
1001  1        2        2
1002  1        1        0
1002  2        1        0
1003  1        1        1

Но пока "numA" сбрасывает CID/Sections с 0 As, я мертв в воде. Я предполагаю, что мое утверждение "group by" в "numA" вымывает нули... но я не уверен в этом. Какие-либо предложения?

1 ответ

@NigelRen предоставил решение - левое соединение. Вот код:

-- Left Join on numTable1 with numA... makes for total students // numAs
-- Resultant table is totA: "Total A Ratings"
create temporary table totA(
    select numTable1.cid, numTable19.section, numTable1.numStudents, if(numA.As is null, 0, numA.As) 'A Ratings'
    from numTable1
    left join numA on numTable1.cid=numA.cid and numTable1.section=numA.section
);
Другие вопросы по тегам