Ver Mensaje Individual
  #30  
Antiguo 09-04-2011
Gallosuarez Gallosuarez is offline
Miembro
 
Registrado: feb 2007
Posts: 92
Reputación: 18
Gallosuarez Va por buen camino
Calentando motores ...

fjcg02:

Muy bien ... ahora ya nos estamos entendiendo ... bueno pues manos a lo obra:

Lo primero que hay que notar es que solo tienes una solo tabla, por lo que de ahí vamos a obtener el pivote ... y del pivote vamos a obtener nuestro resultado final. Por otro lado, es mejor empezar con un caso pequeño (donde los conceptos son fijos). Posteriormente nos movemos hacia un caso más difícil, ¿vale?.

Corre esta sentencia primero (este sería nuestro pivote). Sean benévolos conmigo a lo mejor tengo errores en el nombre de un tabla/campo, etc, etc. Necesito que me digas si funciona correctamente dicha sentencia.
Código SQL [-]
SELECT 
  POBLACION,
  ESTADOCIVIL,
  COUNT(*) AS CANTIDAD
FROM CLIENTE
GROUP BY POBLACION, ESTADOCIVIL

Despues si todo esto se ejecutó sin errores (doy por hecho que así es), creo mi tabla principal donde aparecerán los conceptos.
Código SQL [-]
WITH PIVOTE AS (
  SELECT 
    POBLACION,
    ESTADOCIVIL,
    COUNT(*) AS CANTIDAD
  FROM CLIENTE
  GROUP BY POBLACION, ESTADOCIVIL
)
SELECT
 P.POBLACION,
 COALESCE(P_CASADOS.CANTIDAD, 0) AS CASADOS,
 COALESCE(P_SOLTEROS.CANTIDAD, 0) AS SOLTEROS
FROM PIVOTE P
  LEFT JOIN PIVOTE P_CASADOS
    ON P.POBLACION = P_CASADOS.POBLACION
    AND P_CASADOS.ESTADOCIVIL = 'Casado'
  LEFT JOIN PIVOTE P_SOLTEROS
    ON P.POBLACION = P_SOLTEROS.POBLACION
    AND P_SOLTEROS.ESTADOCIVIL = 'Soltero'
    .
    .

Espero que esto despeje un poco sus dudas. Porqué decimos que esta forma de solucionar el problema es sumamente eficiente, porque la tabla "pivote" solo se ejecuta una sola vez, sin importar cuantos conceptos se agreguen después. Otra cosa que hay que hacer notar es el uso correcto de índices. En este caso no sé si haya indices, sino no los hay, la sentencia pivote tendrá que recorrer toda la tabla (aunque solo sea una solo vez).

Saludos,
Gerardo Suárez Trejo
Responder Con Cita