This commit is contained in:
skidoodle 2024-03-13 00:33:46 +01:00
commit e124a47765
19374 changed files with 9806149 additions and 0 deletions

View file

@ -0,0 +1,248 @@
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
IF OBJECT_ID('[dbo].[sp_Nyomtatvany_Excel_IdoszakiOsztalyokTantargyiStatisztika]') IS NOT NULL
BEGIN
DROP PROCEDURE [dbo].[sp_Nyomtatvany_Excel_IdoszakiOsztalyokTantargyiStatisztika]
END
GO
-- ===================================================================
-- Author: Badits-Nyáradi József
-- ===================================================================
CREATE PROCEDURE [dbo].[sp_Nyomtatvany_Excel_IdoszakiOsztalyokTantargyiStatisztika]
@pTanevId INT,
@pIntezmenyId INT,
@pErtekelestipusaId INT,
@pLezaroNaptipusId INT,
@pTanoraiCsoportTipusIds INT = 1034,
@pMulasztasTipusIdKeses INT = 1499,
@pMulasztasTipusIdHianyzas INT = 1500,
@pNemMulasztaIgazolasTipusIds INT = 1532, -- Iskola érdekű távollét
@pTanevrendjeTanevKezdeteNaptipusId INT = 1394, --Tanévrendje első nap típus
@pElmeletgyakorlat BIT = 0
AS
BEGIN
SET NOCOUNT ON;
DECLARE @idoszakEleje DATE = (
SELECT COALESCE(
(SELECT C_DATUM FROM T_TANEVRENDJE_OSSZES WHERE C_TANEVID = @pTanevId AND C_NAPTIPUSA = @pTanevrendjeTanevKezdeteNaptipusId),
(SELECT C_ELSOTANITASINAP FROM T_TANEV_OSSZES WHERE ID = @pTanevId))
);
DECLARE @idoszakVege DATE = (
SELECT COALESCE(
(SELECT C_DATUM FROM T_TANEVRENDJE_OSSZES WHERE C_TANEVID = @pTanevId AND C_NAPTIPUSA = @pLezaroNaptipusId),
GETDATE())
);
DECLARE @osztalyoktanoraicsoportok TABLE (OSZTALYCSOPORTID INT PRIMARY KEY, C_TIPUSA INT, C_VEGZOSEVFOLYAM CHAR(1));
DECLARE @osztalycsoportok TABLE (OSZTALYCSOPORTID INT PRIMARY KEY);
DECLARE @aktualisOsztalyCsoportok TABLE (OSZTALYCSOPORTID INT);
DECLARE @osztalyTanulok TABLE (TANULOID INT PRIMARY KEY, BELEPESDATUM DATE, KILEPESDATUM DATE);
DECLARE @szurtMulasztas TABLE (TIPUS_CHAR CHAR(1), C_TIPUS INT , C_IGAZOLT CHAR(1), C_TANULOID INT, C_GYAKORLATI CHAR(1), KESESPERC INT, MULASZTASOK_SZAMA INT);
DECLARE @tantargyak TABLE(TANTARGYID INT, TANTARGY_NEV NVARCHAR(MAX), TARGYKATEGORIA_NEV NVARCHAR(MAX), TARGYKATEGORIA_SORSZAM INT, C_FOTARGYE CHAR(1), C_ALTANTARGYKENTNYOMTATVANYBAN CHAR(1));
DECLARE @osztalyok TABLE(OSZTALYID INT, NEV NVARCHAR(MAX), EVFOLYAM INT, SORREND INT);
DECLARE @osztalyokTanulokszama TABLE (OSZTALYID INT, TANULOKSZAMA INT);
DECLARE @osztalyokErtekeles TABLE (OSZTALYID INT, TANTARGYID INT, ATLAG FLOAT);
DECLARE @osztalyokMulasztas TABLE (OSZTALYID INT, TIPUS_CHAR CHAR(1), C_TIPUS INT, C_IGAZOLT CHAR(1), MULASZTASOK_SZAMA INT, C_GYAKORLATI CHAR(1), DESCR CHAR(3));
-- OSZTÁLYOK ÉS TANÓRAI CSOPORTOK
INSERT INTO @osztalyoktanoraicsoportok (OSZTALYCSOPORTID, C_TIPUSA, C_VEGZOSEVFOLYAM) (
SELECT T_OSZTALYCSOPORT_OSSZES.ID, C_TIPUSA, C_VEGZOSEVFOLYAM
FROM T_OSZTALYCSOPORT_OSSZES
LEFT JOIN T_CSOPORT_OSSZES ON T_OSZTALYCSOPORT_OSSZES.ID = T_CSOPORT_OSSZES.ID
LEFT JOIN T_OSZTALY_OSSZES ON T_OSZTALYCSOPORT_OSSZES.ID = T_OSZTALY_OSSZES.ID
WHERE ( C_TIPUSA IN (@pTanoraiCsoportTipusIds) OR T_OSZTALY_OSSZES.ID IS NOT NULL) AND C_TANEVID = @pTanevId
);
-- TANTÁRGYAK
INSERT INTO @tantargyak (TANTARGYID, TANTARGY_NEV, TARGYKATEGORIA_NEV, TARGYKATEGORIA_SORSZAM, C_FOTARGYE, C_ALTANTARGYKENTNYOMTATVANYBAN)
SELECT T_TANTARGY_OSSZES.ID AS TANTARGYID, COALESCE(T_TANTARGY_OSSZES.C_NEVNYOMTATVANYBAN, T_TANTARGY_OSSZES.C_NEV) AS TANTARGY_NEV, T_DICTIONARYITEMBASE_OSSZES.C_NAME AS TARGYKATEGORIA_NEV, T_DICTIONARYITEMBASE_OSSZES.C_VALUE AS TARGYKATEGORIA_SORSZAM, T_TANTARGY_OSSZES.C_FOTARGYE, T_TANTARGY_OSSZES.C_ALTANTARGYKENTNYOMTATVANYBAN
FROM T_TANTARGY_OSSZES
LEFT JOIN T_TARGYKATEGORIATIPUS_OSSZES ON T_TARGYKATEGORIATIPUS_OSSZES.ID = T_TANTARGY_OSSZES.C_TARGYKATEGORIA
LEFT JOIN T_DICTIONARYITEMBASE_OSSZES ON T_DICTIONARYITEMBASE_OSSZES.ID = T_TARGYKATEGORIATIPUS_OSSZES.ID
WHERE T_TANTARGY_OSSZES.TOROLT = 'F' AND T_TANTARGY_OSSZES.C_INTEZMENYID = @pIntezmenyId AND T_TANTARGY_OSSZES.C_TANEVID = @pTanevId
ORDER BY TARGYKATEGORIA_SORSZAM, TANTARGY_NEV;
-- OSZTÁLYOK
SELECT T_OSZTALYCSOPORT_OSSZES.ID AS OSZTALYID, T_OSZTALYCSOPORT_OSSZES.C_NEV AS NEV, T_OSZTALYCSOPORT_OSSZES.C_EVFOLYAMTIPUSA AS EVFOLYAM, T_DICTIONARYITEMBASE_OSSZES.C_ORDER AS SORREND, ROW_NUMBER() OVER(ORDER BY T_DICTIONARYITEMBASE_OSSZES.C_ORDER ASC, T_OSZTALYCSOPORT_OSSZES.C_NEV ASC) AS Row#
INTO #tempOsztalyok
FROM T_OSZTALYCSOPORT_OSSZES
JOIN T_OSZTALY_OSSZES ON T_OSZTALY_OSSZES.ID = T_OSZTALYCSOPORT_OSSZES.ID
JOIN T_TANEV_OSSZES ON T_TANEV_OSSZES.ID = T_OSZTALYCSOPORT_OSSZES.C_TANEVID
JOIN T_DICTIONARYITEMBASE_OSSZES ON T_DICTIONARYITEMBASE_OSSZES.ID = T_OSZTALYCSOPORT_OSSZES.C_EVFOLYAMTIPUSA AND T_DICTIONARYITEMBASE_OSSZES.TOROLT = 'F' AND T_DICTIONARYITEMBASE_OSSZES.C_TANEVID = T_TANEV_OSSZES.ID
WHERE T_OSZTALYCSOPORT_OSSZES.TOROLT = 'F' AND T_OSZTALYCSOPORT_OSSZES.C_INTEZMENYID=@pIntezmenyId AND T_TANEV_OSSZES.TOROLT = 'F' AND T_TANEV_OSSZES.ID = @pTanevId
ORDER BY Row#;
DECLARE @pOsztalyId INT = 0;
DECLARE @sorrend INT = 0;
WHILE (1 = 1)
BEGIN
DELETE FROM @szurtMulasztas;
DELETE FROM @osztalycsoportok;
DELETE FROM @aktualisOsztalyCsoportok;
DELETE FROM @osztalyTanulok;
SELECT TOP 1 @pOsztalyId = OSZTALYID, @sorrend = Row#
FROM #tempOsztalyok
WHERE @sorrend < Row#
ORDER BY Row#;
IF @@ROWCOUNT = 0
BEGIN
BREAK;
END
INSERT INTO @osztalycsoportok (OSZTALYCSOPORTID) (
SELECT ID FROM fnGetKapcsolodoOsztalycsoportok(@pOsztalyId)
WHERE (ID IN (SELECT ID FROM T_OSZTALY_OSSZES) OR ID IN (SELECT ID FROM T_CSOPORT WHERE C_TIPUSA IN (@pTanoraiCsoportTipusIds)))
);
INSERT INTO @aktualisOsztalyCsoportok (OSZTALYCSOPORTID) (
SELECT ID FROM fnGetKapcsolodoOsztalycsoportokByDate(@pOsztalyId, @idoszakEleje, @idoszakVege)
WHERE (ID IN (SELECT ID FROM T_OSZTALY_OSSZES) OR ID IN (SELECT ID FROM T_CSOPORT_OSSZES WHERE C_TIPUSA IN (@pTanoraiCsoportTipusIds)))
);
-- TANULÓK
INSERT INTO @osztalyTanulok (TANULOID, BELEPESDATUM, KILEPESDATUM) (
SELECT T_FELHASZNALO_OSSZES.ID AS TANULOID, C_BELEPESDATUM, C_KILEPESDATUM
FROM T_FELHASZNALO_OSSZES
INNER JOIN (
SELECT C_TANULOID, C_OSZTALYCSOPORTID, C_BELEPESDATUM, C_KILEPESDATUM
FROM T_TANULOCSOPORT_OSSZES
WHERE T_TANULOCSOPORT_OSSZES.TOROLT = 'F' AND T_TANULOCSOPORT_OSSZES.C_BELEPESDATUM < @idoszakVege
AND (T_TANULOCSOPORT_OSSZES.C_KILEPESDATUM IS NULL OR T_TANULOCSOPORT_OSSZES.C_KILEPESDATUM >= @idoszakVege)
) AS TANCSOPORT ON TANCSOPORT.C_TANULOID = T_FELHASZNALO_OSSZES.ID
WHERE T_FELHASZNALO_OSSZES.TOROLT = 'F' AND TANCSOPORT.C_OSZTALYCSOPORTID = @pOsztalyId AND T_FELHASZNALO_OSSZES.C_TANEVID = @pTanevId
);
--TANULÓK LISTA
INSERT INTO @osztalyokTanulokszama (OSZTALYID, TANULOKSZAMA)
SELECT @pOsztalyId AS OSZTALYID, COUNT(T_FELHASZNALO_OSSZES.ID) AS TANULOKSZAMA
FROM T_FELHASZNALO_OSSZES
INNER JOIN @osztalyTanulok AS OSZTALYTANULOK ON OSZTALYTANULOK.TANULOID = T_FELHASZNALO_OSSZES.ID;
INSERT INTO @osztalyokErtekeles (OSZTALYID, TANTARGYID, ATLAG)
SELECT @pOsztalyId AS OSZTALYID, C_TANTARGYID AS TANTARGYID, ROUND(AVG(CAST(ODIB.C_VALUE AS FLOAT)), 2) AS ATLAG
FROM T_OSZTALYZATERTEKELES_OSSZES
INNER JOIN T_TANULOERTEKELES_OSSZES ON T_TANULOERTEKELES_OSSZES.ID = T_OSZTALYZATERTEKELES_OSSZES.ID
INNER JOIN T_TANTARGY_OSSZES ON T_TANTARGY_OSSZES.ID = T_TANULOERTEKELES_OSSZES.C_TANTARGYID AND T_TANTARGY_OSSZES.C_TANEVID = T_TANULOERTEKELES_OSSZES.C_TANEVID
INNER JOIN T_OSZTALYZATTIPUS_OSSZES ON T_OSZTALYZATTIPUS_OSSZES.ID = T_TANULOERTEKELES_OSSZES.C_OSZTALYZAT
LEFT JOIN T_DICTIONARYITEMBASE_OSSZES AS ODIB ON ODIB.ID = T_OSZTALYZATTIPUS_OSSZES.ID
LEFT JOIN T_TARGYKATEGORIATIPUS_OSSZES ON T_TARGYKATEGORIATIPUS_OSSZES.ID = T_TANTARGY_OSSZES.C_TARGYKATEGORIA
LEFT JOIN T_DICTIONARYITEMBASE_OSSZES ON T_DICTIONARYITEMBASE_OSSZES.ID = T_TARGYKATEGORIATIPUS_OSSZES.ID
INNER JOIN @OSZTALYTANULOK AS OSZTALYTANULOK ON OSZTALYTANULOK.TANULOID = T_TANULOERTEKELES_OSSZES.C_TANULOID
WHERE T_TANULOERTEKELES_OSSZES.C_INTEZMENYID = @pIntezmenyId AND T_OSZTALYZATERTEKELES_OSSZES.TOROLT = 'F' AND T_TANULOERTEKELES_OSSZES.C_TANEVID = @pTanevId AND C_ERTEKELESTIPUSA = @pErtekelestipusaId AND (T_TANTARGY_OSSZES.C_FOTARGYE = 'T' OR C_ALTANTARGYKENTNYOMTATVANYBAN = 'T' )
GROUP BY C_TANTARGYID;
--MULASZTÁS
INSERT INTO @szurtMulasztas (TIPUS_CHAR, C_TIPUS, C_IGAZOLT, C_TANULOID, C_GYAKORLATI, KESESPERC, MULASZTASOK_SZAMA) (
SELECT CASE WHEN C_TIPUS = @pMulasztasTipusIdKeses THEN 'K' ELSE 'H' END AS TIPUS_CHAR, C_TIPUS, C_IGAZOLT, C_ORATANULOIID, C_GYAKORLATI, SUM(COALESCE(C_KESESPERCBEN, 0)) AS KESESPERC, COUNT(T_TANULOMULASZTAS_OSSZES.ID) AS MULASZTASOK_SZAMA
FROM T_TANULOMULASZTAS_OSSZES
INNER JOIN @osztalyTanulok AS OSZTALYTANULOK ON OSZTALYTANULOK.TANULOID = T_TANULOMULASZTAS_OSSZES.C_ORATANULOIID
INNER JOIN T_TANITASIORA_OSSZES ON T_TANITASIORA_OSSZES.ID = T_TANULOMULASZTAS_OSSZES.C_TANITASIORAKID
INNER JOIN T_TANTARGY_OSSZES ON T_TANTARGY_OSSZES.ID = T_TANITASIORA_OSSZES.C_TANTARGYID AND T_TANTARGY_OSSZES.C_TANEVID = T_TANITASIORA_OSSZES.C_TANEVID
INNER JOIN T_TANULOCSOPORT_OSSZES ON T_TANITASIORA_OSSZES.C_OSZTALYCSOPORTID = T_TANULOCSOPORT_OSSZES.C_OSZTALYCSOPORTID AND T_TANULOMULASZTAS_OSSZES.C_ORATANULOIID = T_TANULOCSOPORT_OSSZES.C_TANULOID
AND T_TANITASIORA_OSSZES.C_DATUM >= T_TANULOCSOPORT_OSSZES.C_BELEPESDATUM AND (T_TANITASIORA_OSSZES.C_DATUM < T_TANULOCSOPORT_OSSZES.C_KILEPESDATUM OR T_TANULOCSOPORT_OSSZES.C_KILEPESDATUM IS NULL)
INNER JOIN @osztalyoktanoraicsoportok AS OSZTALYOKTANORAICSOPORTOK ON T_TANITASIORA_OSSZES.C_OSZTALYCSOPORTID = OSZTALYOKTANORAICSOPORTOK.OSZTALYCSOPORTID
WHERE T_TANULOMULASZTAS_OSSZES.C_INTEZMENYID = @pIntezmenyId AND T_TANULOMULASZTAS_OSSZES.TOROLT='F' AND T_TANITASIORA_OSSZES.TOROLT = 'F' AND T_TANITASIORA_OSSZES.C_DATUM BETWEEN @idoszakEleje AND @idoszakVege
AND C_IGAZOLT IS NOT NULL AND T_TANULOMULASZTAS_OSSZES.C_TANEVID=@pTanevId AND T_TANULOMULASZTAS_OSSZES.C_TIPUS IN (@pMulasztasTipusIdKeses, @pMulasztasTipusIdHianyzas) AND (C_IGAZOLASTIPUSA IS NULL OR C_IGAZOLASTIPUSA NOT IN (@pNemMulasztaIgazolasTipusIds))
GROUP BY C_TIPUS, C_IGAZOLT, C_ORATANULOIID, C_GYAKORLATI
);
IF @pElmeletgyakorlat=0
BEGIN
INSERT INTO @osztalyokMulasztas (OSZTALYID, TIPUS_CHAR, C_TIPUS, C_IGAZOLT, MULASZTASOK_SZAMA, C_GYAKORLATI, DESCR)
SELECT @pOsztalyId AS OSZTALYID, TIPUS_CHAR, C_TIPUS, C_IGAZOLT, CASE WHEN TIPUS_CHAR = 'K' THEN SUM(KESESORA) ELSE SUM(MULASZTASOK_SZAMA) END MULASZTASOK_SZAMA, 'F' AS C_GYAKORLATI, TIPUS_CHAR + C_IGAZOLT + 'F' AS DESCR
FROM (
SELECT TIPUS_CHAR, C_TIPUS, C_IGAZOLT, C_TANULOID, SUM(KESESPERC) AS KESESPERC, SUM(KESESPERC)/45 AS KESESORA, SUM(MULASZTASOK_SZAMA) AS MULASZTASOK_SZAMA
FROM @szurtMulasztas
GROUP BY TIPUS_CHAR, C_TIPUS, C_IGAZOLT, C_TANULOID
) AS T_SUM_MULASZTAS
GROUP BY TIPUS_CHAR, C_TIPUS, C_IGAZOLT
ORDER BY C_TIPUS DESC, C_IGAZOLT DESC;
END
ELSE
BEGIN
INSERT INTO @osztalyokMulasztas (OSZTALYID, TIPUS_CHAR, C_TIPUS, C_IGAZOLT, MULASZTASOK_SZAMA, C_GYAKORLATI, DESCR)
SELECT @pOsztalyId AS OSZTALYID, TIPUS_CHAR, C_TIPUS, C_IGAZOLT, CASE WHEN TIPUS_CHAR = 'K' THEN SUM(KESESORA) ELSE SUM(MULASZTASOK_SZAMA) END MULASZTASOK_SZAMA, C_GYAKORLATI, TIPUS_CHAR + C_IGAZOLT + C_GYAKORLATI
FROM (
SELECT TIPUS_CHAR, C_TIPUS, C_IGAZOLT, C_TANULOID, KESESPERC, KESESPERC/(CASE WHEN C_GYAKORLATI = 'T' THEN 60 ELSE 45 END) AS KESESORA, MULASZTASOK_SZAMA, C_GYAKORLATI
FROM @szurtMulasztas
) AS T_SUM_MULASZTAS
GROUP BY TIPUS_CHAR, C_TIPUS, C_GYAKORLATI, C_IGAZOLT
ORDER BY C_TIPUS DESC, C_IGAZOLT DESC;
END
END
DECLARE @cols AS NVARCHAR(MAX);
DECLARE @colsHeader AS NVARCHAR(MAX);
DECLARE @query AS NVARCHAR(MAX);
SELECT OSZTALYID, TANTARGYID, /*COALESCE(CONVERT(NVARCHAR, ATLAG), '') AS*/ ATLAG
INTO #tempErtekeles
FROM @osztalyokErtekeles;
SELECT OSZTALYID, TANULOKSZAMA
INTO #tempTanulokszama
FROM @osztalyokTanulokszama;
SELECT @colsHeader = ISNULL(@colsHeader + ', ', '') + QUOTENAME(TANTARGYAK.TANTARGYID) + ' AS ' + QUOTENAME(TANTARGYAK.TANTARGY_NEV),
@cols = ISNULL(@cols + ', ', '') + QUOTENAME(TANTARGYAK.TANTARGYID)
FROM (
SELECT DISTINCT TANTARGYID, TANTARGY_NEV, TARGYKATEGORIA_SORSZAM
FROM @tantargyak
) AS TANTARGYAK
ORDER BY TARGYKATEGORIA_SORSZAM, TANTARGY_NEV;
SET @query =
'SELECT NEV AS [Osztályok], TANULOILETSZAM.TANULOKSZAMA AS [Tanulók száma], ' + @colsHeader + '
FROM (SELECT OSZTALYID, NEV, Row# FROM #tempOsztalyok) AS OSZTALYOK
LEFT JOIN (
SELECT OSZTALYID AS E_OSZTALYID, TANTARGYID, ATLAG
FROM #tempErtekeles
) AS ERTEKELES ON ERTEKELES.E_OSZTALYID = OSZTALYOK.OSZTALYID
PIVOT (
MAX(ATLAG)
FOR TANTARGYID IN (' + @cols + ')
) AS PIVOTTABLE
LEFT JOIN #tempTanulokszama AS TANULOILETSZAM ON PIVOTTABLE.OSZTALYID = TANULOILETSZAM.OSZTALYID
ORDER BY Row#';
execute(@query);
SELECT * INTO #tempMulasztas
FROM @osztalyokMulasztas;
IF @pElmeletgyakorlat=0
BEGIN
SET @cols = 'HTF,KTF,HFF,KFF'
SET @colsHeader = 'HTF AS [Igazolt hiányzás],KTF AS [Igazolt késés (óra)],HFF AS [Igazolatlan hiányzás],KFF AS [Igazolatlan késés (óra)]'
END
ELSE
BEGIN
SET @cols = 'HTF,KTF,HFF,KFF,HTT,KTT,HFT,KFT'
SET @colsHeader = 'HTF AS [Elméleti igazolt hiányzás],KTF AS [Elméleti igazolt késés (óra)],HFF AS [Elméleti igazolatlan hiányzás],KFF AS [Elméleti igazolatlan késés (óra)],HTT AS [Gyakorlati igazolt hiányzás],KTT AS [Gyakorlati igazolt késés (óra)],HFT AS [Gyakorlati igazolatlan hiányzás],KFT AS [Gyakorlati igazolatlan késés (óra)]'
END
SET @query =
'SELECT ' + @colsHeader + '
FROM (SELECT OSZTALYID, NEV, Row# FROM #tempOsztalyok) AS OSZTALYOK
LEFT JOIN (
SELECT OSZTALYID AS M_OSZTALYID, MULASZTASOK_SZAMA, DESCR
FROM #tempMulasztas
) AS MULASZTAS ON MULASZTAS.M_OSZTALYID = OSZTALYOK.OSZTALYID
PIVOT (
MAX(MULASZTASOK_SZAMA)
FOR DESCR IN (' + @cols + ')
) AS PIVOTTABLE
ORDER BY Row#';
execute(@query);
IF OBJECT_ID('tempdb..#tempOsztalyok') IS NOT NULL DROP TABLE #tempOsztalyok
IF OBJECT_ID('tempdb..#tempTanulokszama') IS NOT NULL DROP TABLE #tempTanulokszama
IF OBJECT_ID('tempdb..#tempErtekeles') IS NOT NULL DROP TABLE #tempErtekeles
IF OBJECT_ID('tempdb..#tempMulasztas') IS NOT NULL DROP TABLE #tempMulasztas
END
GO