Bases de Datos > SQL Server
Crear una tabla con totales
(1/1)
ProfesorX:
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:
--- Código: Text --- Colonia Activos InactivosA 2 9B 0 2C 0 1D 1 1
Actualmente saco la informacion de 2 tablas (clientes y contrato), y tengo que crear 3 tablas de la siguiente manera:
--- Código: SQL --- -- Creacion de la tabla activosDROP TABLE colonia_activosSELECT c1.colonia, COUNT(DISTINCT c1.id) AS activosINTO colonia_activosFROM clientes AS c1 INNER JOIN contrato AS c2ON c1.id = c2.clienteWHERE c2.cerrado = 0GROUP BY c1.colonia -- Creacion de la tabla inactivosDROP TABLE colonia_inactivosSELECT c1.colonia, COUNT(DISTINCT c1.id) AS inactivosINTO colonia_inactivosFROM clientes AS c1 INNER JOIN contrato AS c2ON c1.id = c2.clienteWHERE c2.cliente NOT IN (SELECT cliente FROM contrato WHERE cerrado = 0)GROUP BY c1.colonia -- Creacion de la tabla totalesDROP TABLE colonia_totalesSELECT DISTINCT c1.colonia, c2.activos, c3.inactivos INTO colonia_totalesFROM clientes AS c1LEFT JOIN colonia_activos AS c2ON c1.colonia = c2.coloniaLEFT JOIN colonia_inactivos AS c3ON c1.colonia = c3.coloniaORDER BY c1.colonia UPDATE colonia_totalesSET activos = 0WHERE activos IS NULLUPDATE colonia_totalesSET inactivos = 0WHERE inactivos IS NULLSELECT * 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:
--- Código: SQL --- SELECT c1.colonia, COUNT(DISTINCT c2.cliente) AS activos, COUNT(DISTINCT c3.cliente) AS inactivosFROM clientes AS c1 INNER JOIN contrato AS c2ON c1.id = c2.clienteINNER JOIN contrato AS c3ON c1.id = c3.clienteWHERE c2.cerrado = 0ORc3.cliente NOT IN (SELECT cliente FROM contrato WHERE cerrado = 0)GROUP BY c1.coloniaORDER 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:
--- Código: Text --- Colonia Activos InactivosA 11 11B 2 2C 1 1D 2 2
Pero eso mismo ya lo obtengo de manera mas eficiente (un segundo) de la siguiente manera:
--- Código: SQL --- SELECT c1.colonia, COUNT(DISTINCT c1.id) AS totalFROM clientes AS c1 INNER JOIN contrato AS c2ON c1.id = c2.clienteGROUP BY c1.coloniaORDER 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 :)
F_Tanori:
Bueno con lo que haz dado, y sin probar :P, puedes intentar esta idea preeliminar, a ver si te sirve, (y despues viene optimizacion)
--- Código: SQL ---SELECT Colonia,SUM(activos) 'Activos',SUM(inactivos) 'Inactivos' FROM ( --Activos SELECT c1.colonia 'Colonia', COUNT(DISTINCT c1.id) AS activos,0 AS inactivos FROM clientes AS c1 INNER JOIN contrato AS c2 ON c1.id = c2.cliente WHERE c2.cerrado = 0 GROUP BY c1.coloniaUNION -- Inactivos SELECT c1.colonia, 0 , COUNT(DISTINCT c1.id) 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) AS TablaGROUP BY colonia
Saludos
Navegación
Ir a la versión completa