/* @OtraPreg.sql */ /* hacer eco de las sentencias */ SET ECHO ON /* especificar líneas de hasta 132 caracteres */ SET LINESIZE 132 /* especificar tamaño de página 80 líneas */ SET PAGESIZE 80 /* truncar los valores de los atributos si "no caben" en la columna */ SET WRAP OFF /* obtener el número de clientes que tienen abiertas cuentas */ /* en más de una sucursal */ /**********************************************************************/ /* Soluc.1: creando una vista auxiliar con el número de agencias */ /* en que tiene cuentas cada cliente */ /**********************************************************************/ DROP VIEW numAgenCliente; CREATE VIEW numAgenCliente AS SELECT count(distinct agencia) numAg,dni FROM apercuenta GROUP BY dni; SELECT * FROM numAgenCliente; -- comprobar la vista creada /* ahora basta con contar las filas que tienen en la columna numAg un valor > 1 */ SELECT count(distinct dni) masUnaAg FROM numAgenCliente WHERE numAg>1; DROP VIEW numAgenCliente; -- eliminar la vista creada /**********************************************************************/ /* Soluc.2: utilizando la cláusula "having" */ /**********************************************************************/ /* a) selección de los clientes con cuentas en más de una sucursal */ SELECT count(distinct agencia),dni FROM apercuenta GROUP BY dni HAVING count(distinct agencia) > 1 ; /* b) contar los clientes con cuentas en más de una sucursal */ SELECT count(count(distinct agencia)) FROM apercuenta GROUP BY dni HAVING count(distinct agencia) > 1 ; /**********************************************************************/ /* Soluc.3: construyendo join para buscar */ /**********************************************************************/ /* a) selección de los clientes con cuentas en más de una sucursal */ SELECT * FROM apercuenta ap1, apercuenta ap2 WHERE ap1.dni=ap2.dni AND ap1.agencia<>ap2.agencia; /* puesto que así salen muchos repetidos, hay que ... */ /* b) contar los clientes con cuentas en más de una sucursal */ SELECT count(distinct ap1.dni) FROM apercuenta ap1, apercuenta ap2 WHERE ap1.dni=ap2.dni AND ap1.agencia<>ap2.agencia; /**********************************************************************/ /* Soluc.4: con selecciones encadenadas */ /**********************************************************************/ /* a) selección de los clientes con cuentas en más de una sucursal */ SELECT * FROM apercuenta ap1 WHERE 0 < (SELECT count(*) FROM apercuenta ap2 WHERE ap2.dni = ap1.dni AND ap2.agencia <> ap1.agencia); /* b) contar los clientes con cuentas en más de una sucursal */ SELECT count(distinct dni) FROM apercuenta ap1 WHERE 0 < (SELECT count(*) FROM apercuenta ap2 WHERE ap2.dni = ap1.dni AND ap2.agencia <> ap1.agencia); /**********************************************************************/ /* Soluc.5: con el lenguaje PL/SQL */ /**********************************************************************/ /* a) Selección de los clientes con cuentas en más de 1 sucursal */ CREATE TABLE temp (nAg number(3), dni number); DECLARE elDni number; numAg number; cont number(3) := 0; CURSOR c1 IS SELECT distinct dni FROM apercuenta; BEGIN OPEN c1; LOOP FETCH c1 INTO elDni; EXIT WHEN c1%NOTFOUND; SELECT count(distinct agencia) INTO numAg FROM apercuenta WHERE dni=elDni; IF numAg > 1 THEN INSERT INTO temp VALUES (numAg, elDni); cont := cont +1; END IF; END LOOP; COMMIT; END; / SELECT * FROM temp; DROP TABLE temp; /* b) Contar los clientes con cuentas en más de 1 sucursal */ CREATE TABLE temp (nAg number(3)); DECLARE elDni number; numAg number; cont number(3) := 0; CURSOR c1 IS SELECT distinct dni FROM apercuenta; BEGIN OPEN c1; LOOP FETCH c1 INTO elDni; EXIT WHEN c1%NOTFOUND; SELECT count(distinct agencia) INTO numAg FROM apercuenta WHERE dni=elDni; IF numAg > 1 THEN cont := cont +1; END IF; END LOOP; INSERT INTO temp VALUES (cont); COMMIT; END; / SELECT * FROM temp; DROP TABLE temp;