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

[0] Índice de Mensajes

Ir a la versión completa