2014-09-06 2 views
0

У меня возникли проблемы с вычислением количества и группы по функциям в MySQL.Группировка и подсчет по 2 столам

Есть две таблицы, из которых мне нужно подготовить сводный отчет. Соответствующие таблицы: столбцы: Студенты: ID, FirstName, LastName, SchoolID школы: ID, ShortName, FullName, Группа, HeadCoachID

Каждая школа назначается Group в базе данных, где три или четыре школы будет иметь номер группы. Мне нужно подсчитать количество студентов в каждой группе школ. Я могу подсчитать количество учеников в каждой школе и отсортировать школы по группам. Оттуда я могу просто использовать Excel, чтобы суммировать количество студентов в каждой группе. Но я должен сгенерировать отчет непосредственно из MySQL.

SELECT Schools.Group,Schools.ID,Schools.ShortName,Count(Students.ID) From 
Students LEFT JOIN Schools on Students.SchoolID=Schools.ID 
GROUP BY SchoolID ORDER BY Schools.Group 

Вывод этой команды что-то вроде этого:

Group ID ShortName Count(Students.ID) 
2  137 NSHA HS    21 
2  117 Great Neck North 32 
2  118 Great Neck South 30 
3  120 HANC    13 
3  114 Freeport   23 
3  126 Kellenberg   10 
3  152 Uniondale   18 

То, что я хочу, чтобы произвести это вместо того, чтобы:

Group Count(Students.ID) 
2  83 
3  64 

Можно ли это сделать?

ответ

1

Похоже, вы просто хотите, чтобы SUM из подсчетов для каждого Group. Так как у вас уже есть результаты, которые вы ищете, вы можете положить, что во внутреннем запросе, и группа/сумма этих результатов:

SELECT `Group`, SUM(`Count`) 
FROM 
(
    SELECT  Schools.Group, Schools.ID, Schools.ShortName, Count(Students.ID) As `Count` 
    From  Students 
    LEFT JOIN Schools on Students.SchoolID=Schools.ID 
    GROUP BY SchoolID 
) As X 
GROUP BY `Group` 
ORDER BY `Group` 

Хотя, внутренний запрос просто копировать/вставить из твоего - я Интересно, как он работает вообще. Нет ничего перечисленного как SchoolID в вашем Select. Но, тем не менее, он должен указывать вам в правильном направлении.

Возможно, это больше того, что вы ищете? Как ShortName никогда не используется:

SELECT `Group`, SUM(`Count`) 
FROM 
(
    SELECT  Schools.Group, Schools.ID, Count(Students.ID) As `Count` 
    From  Students 
    LEFT JOIN Schools on Students.SchoolID=Schools.ID 
    GROUP BY Schools.Group, Schools.ID 
) As X 
GROUP BY `Group` 
ORDER BY `Group` 

Или, возможно, даже без внутреннего выбора, и только непосредственно:

SELECT  Schools.Group, Count(Students.ID) As `Count` 
From  Students 
LEFT JOIN Schools on Students.SchoolID = Schools.ID 
GROUP BY Schools.Group 
ORDER BY Schools.Group 

Они должны дать некоторое представление о том, куда идти.

+0

Спасибо! Теперь я понимаю внутренние запросы. Просто сгруппировка по «Schools.GROUP» тоже отлично работала. – Thorn

1
SELECT Schools.Group, Count(Students.ID) 
    From Students 
    LEFT JOIN Schools 
    on Students.SchoolID = Schools.ID 
GROUP BY Schools.Group 
ORDER BY Schools.Group 

Вы должны группе schools.group, если вы хотите одну строку для каждой группы, а не students.schoolid (то, что вы в настоящее время группировка по). Также у вас есть ID и Shortname в вашем списке SELECT, но, похоже, не хотят, чтобы эти столбцы были выбраны на основе вашего желаемого результата.

Обратите внимание, что вы можете получить одну строку, где группа schools.group пуста, а число, представляющее любые школы на таблице учеников, не соответствует таблице школ. Если вы не получите такую ​​строку, то внешнее соединение бессмысленно, и вы должны использовать внутреннее соединение, а не левое внешнее соединение.

Смежные вопросы