Ver Mensaje Individual
  #8 (permalink)  
Antiguo 10/09/2013, 09:25
rvaldenegro
 
Fecha de Ingreso: septiembre-2013
Mensajes: 9
Antigüedad: 10 años, 8 meses
Puntos: 0
Respuesta: Consulta recursiva

Holas,

Después de investigar un rato encontré una solución, requiere de dos pasos: 1 función recursiva para obtener las estructuras y una consulta CTE para obtener la cantidad de personas.

Queda así:

Código SQL:
Ver original
  1. ALTER FUNCTION [dbo].[udf_recorreEstructura](
  2.     @pm_est_org_id INT
  3. )
  4. RETURNS @tmpEstOrg TABLE (
  5.     est_org_id INTEGER
  6.     , est_org_id_padre INTEGER NULL
  7.     , niv_org_nivel VARCHAR(150)
  8.     , niv_org_nombre VARCHAR(100)
  9.     , reg_id INTEGER NULL
  10.     , ciu_id INTEGER NULL
  11.     , com_id INTEGER NULL
  12.     , est_org_nombre VARCHAR(100)
  13.     , est_org_descripcion VARCHAR(200) NULL
  14.     , est_org_fec_creacion datetime NULL
  15.     , est_org_activa bit NULL
  16. )  
  17. AS
  18. BEGIN
  19.     --primero verificamos que venga un entero valido
  20.     IF (isnumeric(@pm_est_org_id)=1 AND @pm_est_org_id>0)
  21.     BEGIN
  22.         DECLARE @id_estructura INTEGER;
  23.         SET @id_estructura = CONVERT(INTEGER, @pm_est_org_id);
  24.        
  25.         IF (@id_estructura>0)
  26.         BEGIN
  27.             INSERT INTO @tmpEstOrg (
  28.                 est_org_id, est_org_id_padre, niv_org_nivel, niv_org_nombre, reg_id, ciu_id, com_id
  29.                 , est_org_nombre, est_org_descripcion, est_org_fec_creacion, est_org_activa
  30.             ) SELECT eo.est_org_id, eo.est_org_id_padre, eo.niv_org_nivel, niv.niv_org_nombre
  31.             , eo.reg_id, eo.ciu_id, eo.com_id
  32.             , eo.est_org_nombre, eo.est_org_descripcion, eo.est_org_fec_creacion, eo.est_org_activa
  33.             FROM tbl_estructura_organizativa eo
  34.             LEFT JOIN tbl_nivel_organizativo niv ON niv.niv_org_nivel=eo.niv_org_nivel
  35.             WHERE est_org_id_padre=@id_estructura;
  36.            
  37.             INSERT INTO @tmpEstOrg (
  38.                 est_org_id, est_org_id_padre, niv_org_nivel, niv_org_nombre, reg_id, ciu_id, com_id
  39.                 , est_org_nombre, est_org_descripcion, est_org_fec_creacion, est_org_activa
  40.             ) SELECT f.est_org_id, f.est_org_id_padre, f.niv_org_nivel, f.niv_org_nombre
  41.             , f.reg_id, f.ciu_id, f.com_id
  42.             , f.est_org_nombre, f.est_org_descripcion, f.est_org_fec_creacion, f.est_org_activa
  43.             FROM @tmpEstOrg t
  44.             CROSS APPLY dbo.udf_recorreEstructura(t.est_org_id) f
  45.         END
  46.     END
  47.     RETURN
  48. END


Y luego la consulta CTE

Código SQL:
Ver original
  1. WITH
  2. cteEstructura (
  3.     est_org_id, est_org_nombre
  4. ) AS (
  5.     SELECT est_org_id, est_org_nombre
  6.     FROM tbl_estructura_organizativa
  7.     WHERE est_org_id_padre=0
  8.     OR est_org_id_padre IS NULL
  9. ),
  10. cteInscritos (
  11.     est_org_id, inscritos
  12. ) AS (
  13.     SELECT e.est_org_id, COUNT(p.rut_persona) AS total
  14.     FROM cteEstructura e
  15.     CROSS APPLY dbo.udf_recorreEstructura(e.est_org_id) f
  16.     INNER JOIN tbl_persona p ON p.est_org_id=f.est_org_id
  17.     GROUP BY e.est_org_id
  18. )
  19. SELECT e.est_org_nombre, SUM(i.inscritos) AS inscritos
  20. FROM cteEstructura e
  21. INNER JOIN cteInscritos i ON i.est_org_id=e.est_org_id
  22. GROUP BY e.est_org_nombre
  23. ORDER BY inscritos DESC

Por ahora es la solución que he encontrado y funciona bien, aún creo que existen un par de detalles que pulir y estaré trabajando en ellos.

Agradezco la ayuda al respecto.

Saludos