Mysql Query не работает и показывает ошибку - PullRequest
0 голосов
/ 26 декабря 2018

Я занимаюсь разработкой системы посещаемости студентов и пытаюсь выполнить этот запрос:

select s.full_name,
   s.student_id,
   count(a.id) as total_present,
   count(CASE WHEN TIMEDIFF(min(a.punch_in_time),'10:00:00') THEN '1' END)  'late'
from student s, attendance_record a 
where  a.student_id=s.student_id 
  and a.punch_in_date BETWEEN '2018-12-26' and '2018-12-26'
group by s.student_id

Но это всегда выдает ошибку "Неправильное использование групповой функции"

Я не могу ничего найтинеправильно .Пожалуйста, помогите мне.

Ответы [ 3 ]

0 голосов
/ 26 декабря 2018

В группе по, вы должны поместить ALL неагрегированные столбцы:

select s.full_name,
   s.student_id,
   count(a.id) as total_present,
   count(CASE WHEN TIMEDIFF(min(a.punch_in_time),'10:00:00') THEN '1' END)  'late'
from student s, attendance_record a 
where  a.student_id=s.student_id 
  and a.punch_in_date BETWEEN '2018-12-26' and '2018-12-26'
group by s.student_id , s.full_name

Примечание: лучше объединить таблицу с "LEFT JOIN" или "INNERПРИСОЕДИНЯЙТЕСЬ ", потому что это более читабельно

select s.full_name,
   s.student_id,
   count(a.id) as total_present,
   count(CASE WHEN TIMEDIFF(min(a.punch_in_time),'10:00:00') THEN '1' END)  'late'
from student s
INNER JOIN attendance_record a ON  a.student_id=s.student_id 
where 
   a.punch_in_date BETWEEN '2018-12-26' and '2018-12-26'
group by s.student_id , s.full_name
0 голосов
/ 26 декабря 2018

Я бы предложил написать так:

select s.full_name, s.student_id,
       count(a.student_id) as total_present,
       sum(a.punch_in_time > '10:00:00') as total_late
from student s left join
     attendance_record a 
     on a.student_id = s.student_id and
        a.punch_in_date between '2018-12-26' and '2018-12-26'
group by s.full_name, s.student_id;

Ваша логика для late довольно странная.Почему кто-то с отметкой времени '09:59:59' считается опоздавшим?

0 голосов
/ 26 декабря 2018
SELECT s.full_name, 
       s.student_id, 
       Count(a.id) AS total_present, 
       Count(CASE 
               WHEN TIMEDIFF(Min(a.punch_in_time), '10:00:00') THEN '1' 
             END)  'late' 
FROM   student s, 
       attendance_record a 
WHERE  a.student_id = s.student_id 
       AND a.punch_in_date BETWEEN '2018-12-26' AND '2018-12-26' 
GROUP  BY s.full_name,s.student_id 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...