Solución

Base de datos

Estrategía 1: Eliminar registros usando NOT IN / EXISTS

Algoritmo

En esta estrategía, eliminaremos las visitas que tienen transacciones directamente usando NOT IN. Empecemos por identificar esas visitas. Para este problema, son todos los visit_id de la tabla Transactions.

SELECT visit_id FROM Transactions

En seguida, en la consulta principal, podemos CONTAR los visit_id a nivel customer_id de la tabla Visits excluyendo las visitas que identificamos en la sub consulta. El valor agregado se agrupa en el nivel del customer_id ya que estamos buscando el resultado total para cada cliente. También se cambia el nombre de esta columna tal y como se solicita en el resultado final.

Implementación
SELECT
  customer_id,
  COUNT(visit_id) AS count_no_trans
FROM
  Visits
WHERE
  visit_id NOT IN (
    SELECT
      visit_id
    FROM
      Transactions
  )
GROUP BY
  customer_id

Estrategía 2: Eliminar registros usando LEFT JOIN y IS NULL

Algoritmo

Para este enfoque, queremos excluir las visitas que incluyeron transacciones del conjunto completo de visitas utilizando LEFT JOIN. Para ello, tenemos todas las visitas como la tabla izquierda (tabla Visits) para unir las visitas de la tabla Transactions en la columna compartida visit_id. Para eliminar los registros de la tabla derecha, establecemos su clave como NULL, por lo que los restos en la tabla Visits son los registros de las visitas en las que no se produjeron transacciones.

Para obtener el resultado final, queremos CONTAR el número de visitas asociadas a cada customer_id, y tener el valor agregado agrupado a nivel de customer_id. Por último, actualizamos la columna tal y como se solicita en el enunciado original del problema.

Implementación
SELECT
  customer_id,
  COUNT(*) AS count_no_trans
FROM
  Visits AS v
  LEFT JOIN Transactions AS t ON v.visit_id = t.visit_id
WHERE
  t.visit_id IS NULL
GROUP BY
  customer_id

slackmart blog © 2024