Hola buenas tardes, tengo una aplicación donde los usuarios registran sus ausencias
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 originalDECLARE @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.