Ver Mensaje Individual
  #1 (permalink)  
Antiguo 04/09/2013, 09:57
rvaldenegro
 
Fecha de Ingreso: septiembre-2013
Mensajes: 9
Antigüedad: 11 años, 2 meses
Puntos: 0
Pregunta Consulta recursiva

Hola Estimados,

Hace tiempo no entraba por acá, pero ahora tengo una duda digna de ustedes. He estado trabajando en SQL 2008 con tablas recursivas para generar la estructura organizacional de la empresa. Algo así

tbl_estructura_organizativa
est_org_id
est_org_id_padre
niv_org_nivel
est_org_nombre

Donde est_org_id_padre referencia a est_org_id y niv_org_nivel indica el nivel de profundidad desde 1 hasta n. En este caso la estructura que tengo es Franquiciado, Razon Social, Local, en donde un franquiciado tiene n razones sociales y una razon social tiene n locales. Entonces:
- Franquiciado => niv_org_nivel = 1 y est_org_id_padre = NULL
- Razon social => niv_org_nivel = 2 y est_org_id_padre = id algun franquiciado
- Local => niv_org_nivel = 3 y est_org_id_padre = id alguna razon social

Ahora bien, tengo también una tabla de personas que se relaciona a est_org_id

tbl_persona
per_id
est_org_id
per_nombre

Cada persona se relaciona a un local, no a una razon social o franquiciado directamente sino a un local en especifico. Eso sí, hay que considerar que los otros casos igual podrían darse aunque por ahora no ocurre.

El tema es que necesito saber cuánta gente está asociado a cada franquiciado. En lo práctico esto implica sumar todas las personas que estén asociados a cada razon social y/o local que corresponda al franquiciado.

La verdad es que anteriormente no había trabajado con tablas recursivas, pero me lancé no más pensando "en el camino se arregla la carga" y si bien he logrado un par de soluciones la verdad no están muy lindas y quiero buscar una más óptima. Y humildemente pido su ayuda al respecto

Por ahora he estado jugando un poco con las CTE, pero me trae la estructura completa con todas las razones sociales y los locales de cada franquiciado, eso está OK, sirve en algunos casos, pero para éste en específico necesito el dato consolidado a nivel de franquiciado y no el detalle a nivel de local. ¿Se les ocurre alguna idea?. De antemano mil gracias . Les dejo el código SQL con el que he estado jugando

Código:
WITH Estructura (niv_org_nombre, est_org_id, est_org_nombre, niv_org_nivel) AS (
	SELECT n.niv_org_nombre, eo.est_org_id, eo.est_org_nombre, eo.niv_org_nivel
	FROM tbl_estructura_organizativa eo 
	INNER JOIN tbl_nivel_organizativo n ON n.niv_org_nivel=eo.niv_org_nivel
	WHERE eo.est_org_id_padre IS NULL
	AND eo.niv_org_nivel=1
	UNION ALL
	
	SELECT n.niv_org_nombre, eo.est_org_id, eo.est_org_nombre, eo.niv_org_nivel
	FROM tbl_estructura_organizativa eo 
	INNER JOIN tbl_nivel_organizativo n ON n.niv_org_nivel=eo.niv_org_nivel
	INNER JOIN Estructura AS est ON est.est_org_id=eo.est_org_id_padre
)

SELECT e.est_org_id, e.est_org_nombre, e.niv_org_nivel, tmpInscritos.inscritos
FROM Estructura e 
LEFT JOIN (
	SELECT COUNT(DISTINCT p.per_id) as inscritos, est_org_id
	FROM tbl_persona p
	GROUP BY est_org_id
) tmpInscritos ON tmpInscritos.est_org_id=e.est_org_id
WHERE e.niv_org_nivel=1
GROUP BY e.est_org_id, e.est_org_nombre, e.niv_org_nivel, inscritos
ORDER BY e.niv_org_nivel ASC, e.est_org_nombre ASC;

Gracias a todos por el interés

Un abrazo,

Rodrigo