1

Below is my sql query in oracle 12c. I'm using sqlplus. It's prompting the error "ORA-00979: not a GROUP BY expression". I don't know what when wrong here. Please help.

PROMPT Type the speciality
ACCEPT speciality PROMPT "Speciality: "
SELECT assignment.doctor_id, doctors.name, MAX(assignment.end_assignment) AS end_contract,
(SELECT doctor_availability.end_availability
 FROM doctor_availability
 JOIN doctor_specialities ON doctor_specialities.doctor_id = doctors.id
 AND UPPER(doctor_specialities.specialities) like UPPER('%&speciality%'))
FROM assignment
JOIN doctors ON doctors.id = assignment.doctor_id
JOIN doctor_availability ON doctor_availability.doctor_id = assignment.doctor_id
WHERE doctor_availability.end_availability > 'end_contract'
GROUP BY assignment.doctor_id;

enter image description here

Matt
  • 14,906
  • 27
  • 99
  • 149
Roshan
  • 905
  • 9
  • 21
  • You need to `GROUP BY` `doctors.name` as well as `assignment.doctor_id` – paul Apr 17 '14 at 08:20
  • Could it be that here: SELECT doctor_availability.end_availability FROM doctor_availability JOIN doctor_specialities ON doctor_specialities.doctor_id = doctors.id you have to use doctor_availability.doctors.id becaus you join the table doctor_availability with the table doctor_specialities – OliC Apr 17 '14 at 09:07

2 Answers2

3

Normally if you use the Group by clause you have to put there all the fields which you select without a aggregat function. In your case you select assignment.doctor_id, doctors.name without a aggregate function but in the group by clause you have only the assignment.doctor_id. Try this

SELECT assignment.doctor_id, doctors.name, MAX(assignment.end_assignment) AS end_contract,
(SELECT doctor_availability.end_availability
 FROM doctor_availability
 JOIN doctor_specialities ON doctor_specialities.doctor_id = doctors.id
 AND UPPER(doctor_specialities.specialities) like UPPER('%&speciality%'))
FROM assignment
JOIN doctors ON doctors.id = assignment.doctor_id
JOIN doctor_availability ON doctor_availability.doctor_id = assignment.doctor_id
WHERE doctor_availability.end_availability > 'end_contract'
GROUP BY assignment.doctor_id, doctors.name
OliC
  • 175
  • 6
2

You need to contain all your select values in the group by.

PROMPT Type the speciality
ACCEPT speciality PROMPT "Speciality: "
SELECT assignment.doctor_id, doctors.name, MAX(assignment.end_assignment) AS end_contract,
(SELECT doctor_availability.end_availability
FROM doctor_availability
JOIN doctor_specialities ON doctor_specialities.doctor_id = doctors.id
AND UPPER(doctor_specialities.specialities) like UPPER('%&speciality%'))
FROM assignment
JOIN doctors ON doctors.id = assignment.doctor_id
JOIN doctor_availability ON doctor_availability.doctor_id = assignment.doctor_id
WHERE doctor_availability.end_availability > 'end_contract'
GROUP BY assignment.doctor_id, doctors.name, doctor_availability.end_availability;
Matt
  • 14,906
  • 27
  • 99
  • 149