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