cada vez que falten al trabajo, estos datos se guardan en la tabla Ausencia
Las tablas tienen los siguientes campos
Usuario
Id| Nombre| Legajo| Clave| Activo| Area_Id
Ausencia
Id| Usuario_Id| Observaciones| Fecha
Area
Id| Descripcion
Area: Sistema, Contabilidad, etc..
Hice un stored que muestra la cantidad de ausencias por mes que registraron los usuarios de las distintas Áreas, el stored recibe como parámetro el Id del Área y el año, entonces lo primero que hago es obtener todos los meses que tiene ese año para luego contar cuantas ausencias se registraron en ese mes.
El stored muestra el resultado que quiero, pero el tema es que es muy lento tarda mucha y en la tabla Ausencia solo tengo 40000 datos es poco para la lentitud, no se cómo mejorar el rendimiento de este stored.
Código SQL:
Ver original
DECLARE @Area_Id INT DECLARE @Anho INT SET @Area_Id = 1 SET @Anho = 2017 DECLARE @Meses TABLE ( Mes INT ) INSERT INTO @Meses SELECT DISTINCT DATEPART(MONTH, A.Fecha) FROM Ausencia A WHERE DATEPART(YEAR, A.Fecha) = @Anho ORDER BY DATEPART(MONTH, A.Fecha) ASC DECLARE @Mes INT DECLARE cMes CURSOR FOR SELECT M.Mes FROM @Meses M OPEN cMes FETCH NEXT FROM cMes INTO @Mes WHILE @@FETCH_STATUS = 0 BEGIN DECLARE @RESULT TABLE ( Id INT IDENTITY(1,1) PRIMARY KEY ,Mes INT ,Nombre VARCHAR(50) ,Total INT ) INSERT INTO @RESULT SELECT Q.Mes, Q.Area, Q.Total FROM ( SELECT 'Mes' = @Mes ,'Area' = S.Descripcion ,'Total' = ISNULL( COUNT(*), 0) FROM Ausencia a LEFT JOIN Usuario U ON a.Usuario_Id = U.Id LEFT JOIN Area S ON S.ID = U.Area_Id WHERE MONTH(CONVERT(CHAR(8), a.Fecha, 112)) = @Mes AND YEAR(CONVERT(CHAR(8), a.Fecha, 112)) = @Anho AND U.Area_Id = @Area_Id GROUP BY S.Descripcion UNION /*Si en algún mes no se registró alguna ausencia le pongo 0*/ SELECT 'Mes' = @Mes ,'Area' = S.Descripcion ,'Total' = 0 FROM Area S WHERE S.ID = @Area_Id ) Q DELETE FROM @RESULT WHERE Id IN (SELECT R.Id FROM @RESULT R INNER JOIN @RESULT R1 ON R.Nombre = R1.Nombre AND R.Id < R1.Id) SELECT CASE WHEN Mes = 1 THEN 'Enero' WHEN Mes = 2 THEN 'Febrero' WHEN Mes = 3 THEN 'Marzo' WHEN Mes = 4 THEN 'Abril' WHEN Mes = 5 THEN 'Mayo' WHEN Mes = 6 THEN 'Junio' WHEN Mes = 7 THEN 'Julio' WHEN Mes = 8 THEN 'Agosto' WHEN Mes = 9 THEN 'Septiembre' WHEN Mes = 10 THEN 'Octubre' WHEN Mes = 11 THEN 'Nobiembre' WHEN Mes = 12 THEN 'Diciembre' END AS 'Mes' ,Nombre ,Total FROM @RESULT DELETE @RESULT FETCH NEXT FROM cMes INTO @Mes END CLOSE cMes DEALLOCATE cMes
Espero me puedan ayudar.
Gracias.