2015-08-26 6 views
0

Мой SQL-запрос должен возвращать список значений вместе с датой, но с моими ограниченными знаниями я смог получить только это.Сложный запрос SQL Select с внутренним соединением

Это мой SQL:

select lsu_students.student_grouping,lsu_attendance.class_date, 
count(lsu_attendance.attendance_status) AS count 
from lsu_attendance 
inner join lsu_students 
ON lsu_students.student_grouping="Central1A" 
and lsu_students.student_id=lsu_attendance.student_id 
where lsu_attendance.attendance_status="Present" 
and lsu_attendance.class_date="2015-02-09"; 

Это возвращает:

student_grouping class_date count 
Central1A  2015-02-09 23 

Я хочу, чтобы вернуться:

student_grouping class_date  count 
Central1A   2015-02-09 23 
Central1A   2015-02-10 11 
Central1A   2015-02-11 21 
Central1A   2015-02-12 25 

Этот запрос получает список дат в соответствии с группа студентов:

select distinct(class_date)from lsu_attendance,lsu_students 
where lsu_students.student_grouping like "Central1A" 
and lsu_students.student_id = lsu_attendance.student_id 
order by class_date 
+0

Здравствуйте d1sciple Добро пожаловать в StackOverflow, в следующий раз попытаться обеспечить [** SqlFiddle **] (http://sqlfiddle.com/#!15/5368b/6), чтобы мы могли лучше понять проблему и дать вам ответ намного быстрее. Также прочитайте [** Как спросить **] (http ://переполнение стека.com/help/how-to-ask) И [** Как создать минимальный, полный и проверенный пример. **] (http://stackoverflow.com/help/mcve) –

+0

Почему вы выбираете одну дату если вы хотите несколько дат? –

+0

Мне нужны данные, упрощенные для ввода на диаграмме – d1sciple

ответ

1

Просто вынуть and lsu_attendance.class_date="2015-02-09" или изменить его к ряду, а затем добавить (в конце) GROUP BY lsu_students.student_grouping,lsu_attendance.class_date.

+0

Он работает. Благодарю. – d1sciple

2

Я думаю, что вы просто хотите group by:

select s.student_grouping, a.class_date, count(a.attendance_status) AS count 
from lsu_attendance a inner join 
    lsu_students s 
    ON s.student_grouping = 'Central1A' and 
     s.student_id = a.student_id 
where a.attendance_status = 'Present' 
group by s.student_grouping, a.class_date; 

Комментарии:

  • Используя одиночные кавычки для строковых констант, если у вас есть веские основания.
  • Если вам нужен диапазон дат класса, используйте where с соответствующей логикой фильтрации.
  • Обратите внимание на псевдонимы таблицы. Запрос проще писать и читать.
  • Я добавил группу студентов к group by. Это потребует любой SQL-движок, отличный от MySQL.
+0

Выглядит почти так, как я их пишу, но я положил [внутреннее | левое] соединение в начале строк, чтобы сделать его более очевидным, как используются дополнительные таблицы, и те же с 'и' .... btw, слишком много '' '' '' '' '' ' – Uueerdo

1

Группа по предложению - это то, что вы ищете, чтобы ограничить агрегаты (например, функцию count) для работы внутри каждой группы.

Чтобы получить количество студентов, присутствующих в каждой группе на каждую дату, вы могли бы сделать что-то вроде этого:

select student_grouping, class_date, count(*) as present_count 
from lsu_students join lsu_attendance using (student_id) 
where attendance_status = 'Present' 
group by student_grouping, class_date 

Примечание: для примера, с помощью проще, чем на (если ваш SQL поддерживает его) и помещает имя таблицы перед каждым именем поля, если имя столбца не отображается в нескольких таблицах (хотя это и не повредит).

Если вы хотите ограничить, какие строки данных включены, поместите свои ограничения в , где (это ограничивает, какие строки подсчитываются). Если вы хотите ограничить отображаемые совокупные значения, вы должны использовать с предложением. Например, чтобы увидеть кол Central1A присутствующих учеников каждый день, но только отображать те даты, когда более 20 студентов обнаружился:

select student_grouping, class_date, count(*) as present_count 
from lsu_students join lsu_attendance using (student_id) 
where attendance_status = 'Present' and student_grouping = 'Central1A' 
group by student_grouping, class_date 
having count(*) > 20 
Смежные вопросы