-- Script realizado por Freddy Aparicio Marín.
-- Oracle SQL | Cómo contar valores ausentes en una columna.
-- Ejecuto este ejemplo en un esquema de pruebas donde la tabla aún no existe.

CREATE TABLE demo_clientes_correo (
    id_cliente NUMBER(6) PRIMARY KEY,
    correo     VARCHAR2(254)
);

-- Cargo 30 clientes ficticios. Dejo sin correo uno de cada tres.
INSERT INTO demo_clientes_correo (id_cliente, correo) VALUES (1, 'ana@example.com');
INSERT INTO demo_clientes_correo (id_cliente, correo) VALUES (2, 'luis@example.com');
INSERT INTO demo_clientes_correo (id_cliente, correo) VALUES (3, NULL);
INSERT INTO demo_clientes_correo (id_cliente, correo) VALUES (4, 'diego@example.com');
INSERT INTO demo_clientes_correo (id_cliente, correo) VALUES (5, 'laura@example.com');
INSERT INTO demo_clientes_correo (id_cliente, correo) VALUES (6, NULL);
INSERT INTO demo_clientes_correo (id_cliente, correo) VALUES (7, 'sofia@example.com');
INSERT INTO demo_clientes_correo (id_cliente, correo) VALUES (8, 'juan@example.com');
INSERT INTO demo_clientes_correo (id_cliente, correo) VALUES (9, NULL);
INSERT INTO demo_clientes_correo (id_cliente, correo) VALUES (10, 'mario@example.com');
INSERT INTO demo_clientes_correo (id_cliente, correo) VALUES (11, 'paula@example.com');
INSERT INTO demo_clientes_correo (id_cliente, correo) VALUES (12, NULL);
INSERT INTO demo_clientes_correo (id_cliente, correo) VALUES (13, 'ines@example.com');
INSERT INTO demo_clientes_correo (id_cliente, correo) VALUES (14, 'andres@example.com');
INSERT INTO demo_clientes_correo (id_cliente, correo) VALUES (15, NULL);
INSERT INTO demo_clientes_correo (id_cliente, correo) VALUES (16, 'alicia@example.com');
INSERT INTO demo_clientes_correo (id_cliente, correo) VALUES (17, 'jorge@example.com');
INSERT INTO demo_clientes_correo (id_cliente, correo) VALUES (18, NULL);
INSERT INTO demo_clientes_correo (id_cliente, correo) VALUES (19, 'daniel@example.com');
INSERT INTO demo_clientes_correo (id_cliente, correo) VALUES (20, 'lucia@example.com');
INSERT INTO demo_clientes_correo (id_cliente, correo) VALUES (21, NULL);
INSERT INTO demo_clientes_correo (id_cliente, correo) VALUES (22, 'pablo@example.com');
INSERT INTO demo_clientes_correo (id_cliente, correo) VALUES (23, 'diana@example.com');
INSERT INTO demo_clientes_correo (id_cliente, correo) VALUES (24, NULL);
INSERT INTO demo_clientes_correo (id_cliente, correo) VALUES (25, 'alba@example.com');
INSERT INTO demo_clientes_correo (id_cliente, correo) VALUES (26, 'hugo@example.com');
INSERT INTO demo_clientes_correo (id_cliente, correo) VALUES (27, NULL);
INSERT INTO demo_clientes_correo (id_cliente, correo) VALUES (28, 'leo@example.com');
INSERT INTO demo_clientes_correo (id_cliente, correo) VALUES (29, 'irene@example.com');
INSERT INTO demo_clientes_correo (id_cliente, correo) VALUES (30, NULL);
COMMIT;

-- Cuento todos los clientes y resto los que tienen correo.
-- Resultado esperado: TOTAL = 30, CON_CORREO = 20, SIN_CORREO = 10.
SELECT COUNT(*) AS total,
       COUNT(correo) AS con_correo,
       COUNT(*) - COUNT(correo) AS sin_correo
FROM demo_clientes_correo;