Bueno, ahora es mi turno de pedir ayuda, a ver si alguien me puede ayudar.
Mi problema consiste en lo siguiente, necesito sacar un total de clientes activos e inactivos por colonia, en una sola tabla, de tal forma que quede de la siguiente manera:
Colonia Activos Inactivos
A 2 9
B 0 2
C 0 1
D 1 1
Actualmente saco la informacion de 2 tablas (clientes y contrato), y tengo que crear 3 tablas de la siguiente manera:
-- Creacion de la tabla activos
DROP TABLE colonia_activos
SELECT c1.colonia, COUNT(DISTINCT c1.id) AS activos
INTO colonia_activos
FROM clientes AS c1
INNER JOIN contrato AS c2
ON c1.id = c2.cliente
WHERE c2.cerrado = 0
GROUP BY c1.colonia
-- Creacion de la tabla inactivos
DROP TABLE colonia_inactivos
SELECT c1.colonia, COUNT(DISTINCT c1.id) AS inactivos
INTO colonia_inactivos
FROM clientes AS c1
INNER JOIN contrato AS c2
ON c1.id = c2.cliente
WHERE c2.cliente NOT IN
(SELECT cliente FROM contrato WHERE cerrado = 0)
GROUP BY c1.colonia
-- Creacion de la tabla totales
DROP TABLE colonia_totales
SELECT DISTINCT c1.colonia, c2.activos, c3.inactivos
INTO colonia_totales
FROM clientes AS c1
LEFT JOIN colonia_activos AS c2
ON c1.colonia = c2.colonia
LEFT JOIN colonia_inactivos AS c3
ON c1.colonia = c3.colonia
ORDER BY c1.colonia
UPDATE colonia_totales
SET activos = 0
WHERE activos IS NULL
UPDATE colonia_totales
SET inactivos = 0
WHERE inactivos IS NULL
SELECT * FROM colonia_totales
Quisiera saber si es posible sacar esta informacion creando esa ultima tabla de totales, de una manera mas simple, sin tener que crear 2 tablas intermedias.
Intente lo siguiente:
SELECT c1.colonia,
COUNT(DISTINCT c2.cliente) AS activos,
COUNT(DISTINCT c3.cliente) AS inactivos
FROM clientes AS c1
INNER JOIN contrato AS c2
ON c1.id = c2.cliente
INNER JOIN contrato AS c3
ON c1.id = c3.cliente
WHERE c2.cerrado = 0
OR
c3.cliente NOT IN
(SELECT cliente FROM contrato WHERE cerrado = 0)
GROUP BY c1.colonia
ORDER BY c1.colonia
Pero ademas de que la consulta demora 15 segundos, a diferencia de las anteriores, que hace todo en 2 segundos, no me arroja el resultado correcto, sino que me arroja la suma de activos e inactivos, de la siguiente manera:
Colonia Activos Inactivos
A 11 11
B 2 2
C 1 1
D 2 2
Pero eso mismo ya lo obtengo de manera mas eficiente (un segundo) de la siguiente manera:
SELECT c1.colonia, COUNT(DISTINCT c1.id) AS total
FROM clientes AS c1
INNER JOIN contrato AS c2
ON c1.id = c2.cliente
GROUP BY c1.colonia
ORDER BY c1.colonia
Repito mi pregunta, alguna idea para sacar el resultado de totales que deseo, sin tener que crear 3 tablas intermedias?
Uso SQL Server 2000
Saludos