IF OBJECT_ID('dbo.fnGetLemorzsolodottTanulokByFelhely') IS NOT NULL BEGIN DROP FUNCTION dbo.fnGetLemorzsolodottTanulokByFelhely END GO SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO -- A Funkció visszaadja a lemorzsolódás szempontjából releváns tanulók listáját az adott feladatellátási helyre, évfolymaonként és nemenként, valamint hogy CREATE FUNCTION dbo.fnGetLemorzsolodottTanulokByFelhely (@feladatEllatasiHelyId INT, @tanevId INT, @isFelevi INT) RETURNS @retTable TABLE ( TanuloId INT PRIMARY KEY, Evfolyam INT, Neme INT, IsKozepesMiatt INT, IsRontasMiatt INT ) BEGIN -- Használt temporary táblák elkészítése DECLARE @Evfolyamok TABLE (Id INT, Evfolyam INT) DECLARE @Osztalyzatok TABLE (Id INT, Ertek FLOAT) DECLARE @FHhozTartozoTanulok TABLE (TanuloId INT, Evfolyam INT, Neme INT) DECLARE @TanuloAtlagok TABLE (TanuloId INT, AktualisAtlag FLOAT, KorabbiAtlag FLOAT) DECLARE @KozepesAlattiTanulok TABLE (TanuloId INT) DECLARE @RontottTanulok TABLE (TanuloId INT) -- Mi a "Közepes" értéke az adott feladatellátási helyen DECLARE @FelHelyTipusKozepes FLOAT = 3.0 SELECT @FelHelyTipusKozepes = IIF( fh.C_OKTATASINEVELESIFELADATTIPUS IN (1160, 1161, 1162, 5435, 1176, 6463) , 2.5 , 3.0 ) FROM T_FELADATELLATASIHELY fh WHERE fh.ID = @feladatEllatasiHelyId AND fh.TOROLT = 'F' -- Az előző tanév ID-ja DECLARE @ElozoTanevId INT = 0 SELECT @ElozoTanevId = ISNULL(elozotanev.ID,0) FROM T_TANEV_OSSZES akttanev INNER JOIN T_TANEV_OSSZES elozotanev ON elozotanev.C_INTEZMENYID = akttanev.C_INTEZMENYID AND elozotanev.TOROLT = 'F' WHERE akttanev.ID = @tanevId AND ( (akttanev.C_NEV = '2017/2018' AND elozotanev.C_NEV = '2016/2017') OR (akttanev.C_NEV = '2018/2019' AND elozotanev.C_NEV = '2017/2018') OR (akttanev.C_NEV = '2019/2020' AND elozotanev.C_NEV = '2018/2019') OR (akttanev.C_NEV = '2020/2021' AND elozotanev.C_NEV = '2019/2020') OR (akttanev.C_NEV = '2021/2022' AND elozotanev.C_NEV = '2020/2021') OR (akttanev.C_NEV = '2022/2023' AND elozotanev.C_NEV = '2021/2022') ) DECLARE @BesorolasiDatum DATE = (SELECT TOP 1 C_DATUM from T_TANEVRENDJE tr WHERE C_NAPTIPUSA = IIF(@isFelevi = 0,1395,1400) AND C_TANEVID = @tanevid AND TOROLT='F') INSERT INTO @Evfolyamok SELECT ID, Evfolyam FROM (SELECT DISTINCT id, CASE WHEN ID IN (1307,1330,1334) THEN 1307 /* 5. évfolyam*/ WHEN ID IN (1308) THEN 1308 /* 6. évfolyam*/ WHEN ID IN (1309,1331,1335) THEN 1309 /* 7. évfolyam*/ WHEN ID IN (1310,1324) THEN 1310 /* 8. évfolyam*/ WHEN ID IN (1311,1316,1332,1333,3018,3019,3020) THEN 1311 /* 9. évfolyam*/ WHEN ID IN (1312,1323) THEN 1312 /* 10. évfolyam*/ WHEN ID IN (1313, 1317, 1325,3016 ) THEN 1313 /* 11. évfolyam*/ WHEN id in (1314,1318,1326, 3017, 3021, 3022,1319, 1322) THEN 1314 /* 12. évfolyam*/ WHEN ID IN (6471, 6473, 6475, 6472, 6474, 6476) THEN 6471 /* SzH */ WHEN ID IN (6477, 6479, 6481, 6478, 6480, 6482) THEN 6477 /* KH */ ELSE NULL END AS Evfolyam FROM T_DICTIONARYITEMBASE WHERE C_TYPE = 'EvfolyamTipus' AND C_TANEVID = @tanevId) Evfolyamok WHERE Evfolyam IS NOT NULL INSERT INTO @Osztalyzatok SELECT ID, CONVERT(FLOAT,C_VALUE) FROM T_DICTIONARYITEMBASE WHERE C_TYPE = 'OsztalyzatTipus' AND C_TANEVID = @tanevId -- Egy adott FH-hoz tartozó tanulók kilistázása (évfolyamonként, nemenként) INSERT INTO @FHhozTartozoTanulok SELECT DISTINCT tcs.C_TANULOID, evf.Evfolyam, f.C_NEME FROM T_OSZTALYCSOPORT ocs INNER JOIN T_TANULOCSOPORT tcs ON tcs.C_OSZTALYCSOPORTID = ocs.ID AND tcs.TOROLT = 'F' AND tcs.C_TANEVID = @tanevId AND tcs.C_BELEPESDATUM <= @BesorolasiDatum AND (tcs.C_KILEPESDATUM >= @BesorolasiDatum OR tcs.C_KILEPESDATUM IS NULL) INNER JOIN T_FELHASZNALO f ON f.id = tcs.C_TANULOID INNER JOIN @Evfolyamok evf ON evf.Id = ocs.C_EVFOLYAMTIPUSA WHERE ocs.C_FELADATELLATASIHELYID = @feladatEllatasiHelyId AND ocs.C_TANEVID = @tanevId -- Visszatérési tábla számítása INSERT INTO @KozepesAlattiTanulok (TanuloId) SELECT DISTINCT fht.TanuloId FROM T_TANULOERTEKELES te INNER JOIN @Osztalyzatok o ON o.ID = te.C_ERTEKELESOSZTALYZATID INNER JOIN @FHhozTartozoTanulok fht ON fht.TanuloId = te.C_TANULOID WHERE te.C_TIPUSID = IIF(@isFelevi = 0,1520,1519) AND te.C_TANEVID = @tanevId GROUP BY fht.TanuloId HAVING ROUND(AVG(o.Ertek),1) < @FelHelyTipusKozepes INSERT INTO @TanuloAtlagok (TanuloId, AktualisAtlag, KorabbiAtlag) SELECT fht.TanuloId, ( SELECT ROUND(AVG(o.Ertek),1) FROM T_TANULOERTEKELES te INNER JOIN @Osztalyzatok o ON o.ID = te.C_ERTEKELESOSZTALYZATID WHERE te.C_TANULOID = tanulo.ID AND te.C_TIPUSID = IIF(@isFelevi = 0,1520,1519) ), ( SELECT ROUND(AVG(o.Ertek),1) FROM T_TANULOERTEKELES_OSSZES te INNER JOIN @Osztalyzatok o ON o.ID = te.C_ERTEKELESOSZTALYZATID WHERE te.C_TANULOID = extanulo.ID AND te.C_TIPUSID = IIF(@isFelevi = 0,1519,1520) AND te.TOROLT = 'F' ) FROM @FHhozTartozoTanulok fht INNER JOIN T_FELHASZNALO tanulo ON tanulo.ID = fht.TanuloId INNER JOIN T_FELHASZNALO_OSSZES extanulo ON tanulo.C_OKTATASIAZONOSITO = extanulo.C_OKTATASIAZONOSITO AND extanulo.C_TANEVID = IIF(@isFelevi = 0,@tanevId,@ElozoTanevId) AND extanulo.TOROLT = 'F' WHERE ( (@isFelevi = 1 AND tanulo.ID <> extanulo.ID) OR (@isFelevi = 0 AND tanulo.ID = extanulo.ID) ) INSERT INTO @RontottTanulok (TanuloId) SELECT DISTINCT fht.TanuloId FROM @FHhozTartozoTanulok fht INNER JOIN @TanuloAtlagok ta ON ta.TanuloId = fht.TanuloId WHERE (ta.AktualisAtlag+1.1) <= ta.KorabbiAtlag INSERT INTO @retTable (TanuloId, Evfolyam, Neme, IsKozepesMiatt, IsRontasMiatt) SELECT fht.TanuloId, fht.Evfolyam, fht.Neme, IIF(kozepes.TanuloId IS NULL, 0, 1), IIF(rontott.TanuloId IS NULL, 0, 1) FROM @FHhozTartozoTanulok fht LEFT JOIN @KozepesAlattiTanulok kozepes ON kozepes.TanuloId = fht.TanuloId LEFT JOIN @RontottTanulok rontott ON rontott.TanuloId = fht.TanuloId WHERE (kozepes.TanuloId IS NOT NULL OR rontott.TanuloId IS NOT NULL) RETURN END GO