Ver Mensaje Individual
  #1 (permalink)  
Antiguo 18/09/2010, 13:28
Avatar de djmashe
djmashe
 
Fecha de Ingreso: julio-2007
Ubicación: Posadas, Misiones
Mensajes: 52
Antigüedad: 16 años, 10 meses
Puntos: 2
Exclamación Join de 3 tablas y COUNT en 1

Saludos, tengo 3 tablas con los siguientes campos:
  • Tabla te01_conductores: id_conductor (PK), te09_id_municipio (FK de te09_municipios), …
  • Tabla te09_municipios: id_municipio (PK), municipio (varchar), …
  • Tabla te10_conductores_inhabilitados: id_inh (PK), id_conductor (FK de te01_conductores), vigencia (boolean), …

La relación está dada por:

Código:
municipios --> conductores <-- inhabilitados
La idea es listar el total de conductores inhabilitados por municipio (que depende del campo vigencia), pero mostrando en el caso que el municipio no tenga, el valor ‘0’.

Si realizo la siguiente consulta puedo obtener todos los municipios con o sin valores en el campo cantidad:

Código SQL:
Ver original
  1. SELECT te09_municipios.municipio, COUNT(te10_conductores_inhabilitados.vigencia) AS cantidad
  2. FROM te01_conductores
  3.  LEFT OUTER JOIN te10_conductores_inhabilitados ON (te01_conductores.id_conductor = te10_conductores_inhabilitados.id_conductor)
  4.  RIGHT OUTER JOIN te09_municipios ON (te01_conductores.te09_id_municipio = te09_municipios.id_municipio)
  5. GROUP BY te09_municipios.municipio
  6. ORDER BY  cantidad;
lo cual da como resultado (75 registros):

Código:
municipio			cantidad
----------------------------------------
General Urquiza			0
Corpus				0
Colonia Delicia			0
Arroyo del Medio		0
Mojón Grande			0
9 de Julio			0
Azara				0
Santa María			0
Los Helechos			0
Florentino Ameghino		0
Itacaruaré			0
O. V. Andrade			0
Almafuerte			0
San José			0
Candelaria			0
Santo Pipó			0
Apóstoles			0
Leandro N. Alem			0
Profundidad			0
Fachinal			0
Cerro Corá			0
Loreto				0
General Alvear			0
Panambi				0
Caá Yarí			0
Gobernador López		0
San Ignacio			0
Dos de Mayo			0
San Javier			0
Dos Arroyos			0
Guaraní				0
Bonpland			0
Puerto Piray			1
Colonia Victoria		1
Santiago de Liniers		1
Caraguatay			1
San Antonio			1
Colonia Polana			1
Puerto Leoni			1
Santa Ana			1
Mártires			1
El Soberbio			1
Colonia Aurora			1
Tres Capones			1
Garuhapé			1
Cerro Azul			1
Puerto Libertad			2
El Alcázar			2
Gobernador Roca			2
Ruiz de Montoya			2
Colonia Wanda			2
Campo Viera			2
San Martín			2
Bernardo Irigoyen		2
25 de Mayo			2
Hipólito Irigoyen		2
C. de la Sierra			2
Alba Posse			2
Campo Grande			2
Montecarlo			3
Aristóbulo del Valle		3
Campo Ramón			3
Cte. Andresito			3
Colonia Alberdi			3
San Pedro			4
Garupá				4
San Vicente			4
Puerto Esperanza		5
Capioví				5
Jardín América			7
Puerto Rico			13
Puerto Iguazú			19
Posadas				24
Oberá				28
Eldorado			34
Pero si ha dicha consulta la modifico agregando un WHERE que condicione el campo vigencia, no me muestra las filas con valor 0. O sea:

Código SQL:
Ver original
  1. SELECT te09_municipios.municipio, COUNT(te10_conductores_inhabilitados.vigencia) AS cantidad
  2. FROM te01_conductores
  3.  LEFT OUTER JOIN te10_conductores_inhabilitados ON (te01_conductores.id_conductor = te10_conductores_inhabilitados.id_conductor)
  4.  RIGHT OUTER JOIN te09_municipios ON (te01_conductores.te09_id_municipio = te09_municipios.id_municipio)
  5. WHERE te10_conductores_inhabilitados.vigencia = TRUE
  6. GROUP BY te09_municipios.municipio
  7. ORDER BY  cantidad;

da como resultado (32 registros):

Código:
municipio			cantidad
----------------------------------------
Puerto Piray			1
Colonia Victoria		1
Santiago de Liniers		1
Caraguatay			1
San Antonio			1
Colonia Polana			1
Puerto Leoni			1
Santa Ana			1
Mártires			1
El Soberbio			1
Colonia Aurora			1
Tres Capones			1
Garuhapé			1
Cerro Azul			1
Puerto Libertad			2
El Alcázar			2
Gobernador Roca			2
Ruiz de Montoya			2
Colonia Wanda			2
Campo Viera			2
San Martín			2
Bernardo Irigoyen		2
25 de Mayo			2
Hipólito Irigoyen		2
C. de la Sierra			2
Alba Posse			2
Campo Grande			2
Montecarlo			3
Aristóbulo del Valle		3
Campo Ramón			3
Cte. Andresito			3
Colonia Alberdi			3
San Pedro			4
Garupá				4
San Vicente			4
Puerto Esperanza		5
Capioví				5
Jardín América			7
Puerto Rico			13
Puerto Iguazú			19
Posadas				24
Oberá				28
Eldorado			34
  • ¿Hay alguna manera de realizar el WHERE para filtrar el campo vigencia pero devolviendo tambien las filas en municipio que no tengan datos?
  • ¿Están mal los joins?

Ya probé CASE WHEN y me dió el mismo resultado.

Gracias desde ya a quien pueda dar una mano...

Última edición por djmashe; 19/09/2010 a las 09:18