Estoy tratando de contar cuántos de los objetos aparecen en la tabla 2 sin el estado 3 o 5. Entonces, si tiene el estado 3 o 5, quiero excluirlo del conteo. Donde estoy atascado es que hay valores duplicados, ya que pueden tener más de un estado. Más explicación a continuación.
Table 1 Object_ID 1 2 3 4 5 Table 2 ID | object_id | status 1 2 2 2 2 3 3 2 5 4 3 2 5 3 2 6 3 7OBJETIVO FINAL
Cuente cuántos object_ids tienen un estado excluyendo 3 o 5. Pero también para ignorar los duplicados. En este ejemplo, el recuento total sería 1 (con object_id 3). Como necesito encontrar todas las filas en la tabla 2, entonces esencialmente las fusiono asumiendo que ninguna de ellas tiene un estado de 3 o 5.
Count. | object_id 1 | 3 SELECT Count(distinct(object_id)) FORM table_2 WHERE status <> 3 or status <> 5Parece que puedo agruparlos si el estado es 3 o 5, pero parece que no puedo excluirlos.
Con suerte, tiene sentido, he tratado de simplificarlo para no tener código irrelevante incluido.
Un método sin subconsultas es:
select count(distinct object_id) - count(distinct case when status in (3, 5) then object_id end) from table_2;Esto cuenta el número de identificadores de objetos distintos y luego resta el número de identificadores de objetos distintos que tienen los estados especificados.
Más típicamente, abordaría esto con dos niveles de agregación:
select count(*) from (select object_id from table_2 group by object_id having sum( status in (3, 5) ) = 0 ) oPuedes usar la agregación:
select count(*) from ( select object_id from table2 group by object_id having max(status in (3, 5)) = 0 ) t