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