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
);