I'm trying to find measuring component ids that show up at least 3 times. At this time it is throwing the Oracle Error "ORA-00936: missing expression." I have tried putting in an existing statement to possibly satisfy the missing expression error, to no avail. It either returned too many values or didn't bring back any values at all. How do I fix it to bring back results where my measuring component column brings back values that occur at least 3 times.
select td.td_entry_id, td.complete_dttm, imd.init_msrmt_data_id, imd.measr_comp_id,
imd.bus_obj_cd, imd.bo_status_cd, imd.status_upd_dttm, rep.last_name FROM
ci_td_entry td,
ci_td_drlkey drill,
d1_init_msrmt_data imd,
sc_user rep
WHERE td.td_type_cd ='D1-IMDTD'
and td.entry_status_flg = 'C'
and imd.init_msrmt_data_id = drill.key_value
and td.td_entry_id = drill.td_entry_id
and imd.bo_status_cd in ('DISCARDED','REMOVED')
and td.complete_user_id = rep.user_id
and td.complete_dttm >= '01-MAY-21'
and (select count(*)
from d1_init_msrmt_data imd
group by imd.measr_comp_id
HAVING COUNT(*) > 3);
My original query works using the group by and having function once you add in the expression exists. What needed to be done to have the subquery actually work though was to correlate it to the main query. This was done by adding in the date parameter found in the main query, the parameter looking for "discarded and removed" and also by creating an inner join in the sub query itself, which joined the table used in the sub query to the table in the main query. The final result looked like this:
SELECT
td.td_entry_id,
td.complete_dttm,
imd.init_msrmt_data_id,
imd.measr_comp_id,
imd.bus_obj_cd,
imd.bo_status_cd,
imd.status_upd_dttm,
rep.last_name
FROM
ci_td_entry td,
ci_td_drlkey drill,
d1_init_msrmt_data imd,
sc_user rep
WHERE
td.td_type_cd = 'D1-IMDTD'
AND td.entry_status_flg = 'C'
AND imd.init_msrmt_data_id = drill.key_value
AND td.td_entry_id = drill.td_entry_id
AND td.complete_dttm = imd.status_upd_dttm
AND imd.bo_status_cd IN (
'DISCARDED',
'REMOVE'
)
AND td.complete_user_id = rep.user_id
AND EXISTS (
SELECT
COUNT(*)
FROM
d1_init_msrmt_data imd2
WHERE
imd.measr_comp_id = imd2.measr_comp_id
AND imd2.status_upd_dttm >= '01-JUN-21'
AND imd2.bo_status_cd IN (
'DISCARDED',
'REMOVE'
)
GROUP BY
imd2.measr_comp_id
HAVING
COUNT(*) >= 3
);
I appreciate everyone's help in getting this result.