kreta/Kreta.DataAccess.Migrations/DBScripts/Database/dbo/Functions/fnGetKapcsolodoOsztalyCsoportokByDateRange.sql
2024-03-13 00:33:46 +01:00

174 lines
No EOL
7.8 KiB
Transact-SQL

DROP FUNCTION IF EXISTS dbo.fnGetKapcsolodoOsztalyCsoportokByDateRange
GO
CREATE FUNCTION dbo.fnGetKapcsolodoOsztalyCsoportokByDateRange (
@pOsztalyCsoportId int
,@pStartDate datetime
,@pEndDate datetime
,@pIntezmenyId int
,@pTanevId int
)
RETURNS @Result TABLE (
Id int primary key NOT NULL
,Kezdete datetime NOT NULL
,Vege datetime NOT NULL
) AS
BEGIN
DECLARE
@tanevStart datetime
,@tanevEnd datetime
,@osztalyId int
DECLARE @kategoriaId int = (SELECT C_FELADATKATEGORIAID FROM T_OSZTALYCSOPORT_OSSZES WHERE ID = @pOsztalyCsoportId)
IF EXISTS (SELECT 1 FROM T_OSZTALY_OSSZES WHERE ID = @pOsztalyCsoportId) BEGIN
INSERT INTO @Result (Id, Kezdete, Vege) /* maga az osztály */
SELECT
o.Id
,@pStartDate
,@pEndDate
FROM T_OSZTALY_OSSZES o
WHERE o.ID = @pOsztalyCsoportId
AND o.C_ALTANEVID = @pTanevID
AND o.C_ALINTEZMENYID = @pIntezmenyId
AND o.TOROLT = 'F'
UNION ALL
SELECT /* Az osztály bontott csoportjai */
cs.ID
,@pStartDate
,@pEndDate
FROM T_CSOPORT_OSSZES cs
WHERE C_OSZTALYBONTASID = @pOsztalyCsoportId
AND cs.TOROLT = 'F'
AND cs.C_ALTANEVID = @pTanevID
AND cs.C_ALINTEZMENYID = @pIntezmenyId
INSERT INTO @Result (Id, Kezdete, Vege) /* Az osztály tanulóinak más csoportjai */
SELECT
tcs.C_OSZTALYCSOPORTID AS Id
,CASE
WHEN MIN(tcs.C_BELEPESDATUM) > MIN(oszt.C_BELEPESDATUM) AND MIN(tcs.C_BELEPESDATUM) > @pStartDate THEN MIN(tcs.C_BELEPESDATUM)
WHEN MIN(oszt.C_BELEPESDATUM) > MIN(tcs.C_BELEPESDATUM) AND MIN(oszt.C_BELEPESDATUM) > @pStartDate THEN MIN(oszt.C_BELEPESDATUM)
ELSE @pStartDate
END AS Kezdete -- A három közül a legnagyobb
,CASE
WHEN MAX(ISNULL(tcs.C_KILEPESDATUM, @pEndDate)) < MAX(ISNULL(oszt.C_KILEPESDATUM, @pEndDate)) AND MAX(ISNULL(tcs.C_KILEPESDATUM, @pEndDate)) < @pEndDate THEN MIN(ISNULL(tcs.C_KILEPESDATUM, @pEndDate))
WHEN MAX(ISNULL(oszt.C_KILEPESDATUM, @pEndDate)) < MAX(ISNULL(tcs.C_KILEPESDATUM, @pEndDate)) AND MAX(ISNULL(oszt.C_KILEPESDATUM, @pEndDate)) < @pEndDate THEN MIN(ISNULL(oszt.C_KILEPESDATUM, @pEndDate))
ELSE @pEndDate -- A három közül a legkisebb
END AS Vege
FROM T_TANULOCSOPORT_OSSZES tcs
INNER JOIN T_TANULOCSOPORT_OSSZES oszt
ON oszt.C_TANULOID = tcs.C_TANULOID
AND oszt.C_OSZTALYCSOPORTID = @pOsztalyCsoportId
AND oszt.C_BELEPESDATUM <= @pEndDate
AND (oszt.C_KILEPESDATUM > @pStartDate OR oszt.C_KILEPESDATUM IS NULL)
INNER JOIN T_CSOPORT_OSSZES cs ON cs.ID = tcs.C_OSZTALYCSOPORTID AND cs.C_OSZTALYBONTASID IS NULL
INNER JOIN T_OSZTALYCSOPORT_OSSZES ocs ON ocs.ID = cs.ID AND ocs.TOROLT = 'F' AND ocs.C_FELADATKATEGORIAID = @kategoriaId
WHERE tcs.TOROLT = 'F'
AND oszt.TOROLT = 'F'
AND tcs.C_TANEVID = @pTanevId
AND tcs.C_INTEZMENYID = @pIntezmenyId
AND tcs.C_BELEPESDATUM <= @pEndDate
AND (tcs.C_KILEPESDATUM > @pStartDate OR tcs.C_KILEPESDATUM IS NULL)
AND NOT EXISTS (SELECT 1 FROM @Result r WHERE r.ID = tcs.C_OSZTALYCSOPORTID)
GROUP BY tcs.C_OSZTALYCSOPORTID
END
IF EXISTS (SELECT 1 FROM T_CSOPORT_OSSZES WHERE ID = @pOsztalyCsoportId AND C_OSZTALYBONTASID IS NOT NULL AND TOROLT = 'F') BEGIN
SELECT @osztalyId = C_OSZTALYBONTASID FROM T_CSOPORT_OSSZES WHERE ID = @pOsztalyCsoportId
INSERT INTO @Result (Id, Kezdete, Vege) /* Az osztály, amelyiknek a bontása */
SELECT
@osztalyId
,@pStartDate
,@pEndDate
UNION ALL
SELECT /* Maga a csoport */
@pOsztalyCsoportId
,@pStartDate
,@pEndDate
INSERT INTO @Result (Id, Kezdete, Vege) /* Az csoport tanulóinak más csoportjai */
SELECT
tcs.C_OSZTALYCSOPORTID AS Id
,CASE
WHEN MIN(tcs.C_BELEPESDATUM) > MIN(csop.C_BELEPESDATUM) AND MIN(tcs.C_BELEPESDATUM) > @pStartDate THEN MIN(tcs.C_BELEPESDATUM)
WHEN MIN(csop.C_BELEPESDATUM) > MIN(tcs.C_BELEPESDATUM) AND MIN(csop.C_BELEPESDATUM) > @pStartDate THEN MIN(csop.C_BELEPESDATUM)
ELSE @pStartDate
END AS Kezdete -- A három közül a legnagyobb
,CASE
WHEN MAX(ISNULL(tcs.C_KILEPESDATUM, @pEndDate)) < MAX(ISNULL(csop.C_KILEPESDATUM, @pEndDate)) AND MAX(ISNULL(tcs.C_KILEPESDATUM, @pEndDate)) < @pEndDate THEN MIN(ISNULL(tcs.C_KILEPESDATUM, @pEndDate))
WHEN MAX(ISNULL(csop.C_KILEPESDATUM, @pEndDate)) < MAX(ISNULL(tcs.C_KILEPESDATUM, @pEndDate)) AND MAX(ISNULL(csop.C_KILEPESDATUM, @pEndDate)) < @pEndDate THEN MIN(ISNULL(csop.C_KILEPESDATUM, @pEndDate))
ELSE @pEndDate
END AS Vege -- A három közül a legkisebb
FROM T_TANULOCSOPORT_OSSZES tcs
INNER JOIN T_TANULOCSOPORT_OSSZES csop
ON tcs.C_TANULOID = csop.C_TANULOID
AND csop.C_OSZTALYCSOPORTID = @pOsztalyCsoportId
AND csop.C_BELEPESDATUM <= @pEndDate
AND (csop.C_KILEPESDATUM > @pStartDate OR csop.C_KILEPESDATUM IS NULL)
AND csop.TOROLT = 'F'
INNER JOIN T_CSOPORT_OSSZES cs
ON cs.ID = tcs.C_OSZTALYCSOPORTID
AND (cs.C_OSZTALYBONTASID IS NULL OR cs.C_OSZTALYBONTASID = @osztalyId)
INNER JOIN T_OSZTALYCSOPORT_OSSZES ocs ON ocs.ID = cs.ID AND ocs.TOROLT='F' AND ocs.C_FELADATKATEGORIAID = @kategoriaId
WHERE tcs.C_OSZTALYCSOPORTID <> @pOsztalyCsoportId
AND tcs.C_TANEVID = @pTanevId
AND tcs.C_INTEZMENYID = @pIntezmenyId
AND tcs.C_BELEPESDATUM <= @pEndDate
AND (tcs.C_KILEPESDATUM > @pStartDate OR tcs.C_KILEPESDATUM IS NULL)
AND tcs.TOROLT = 'F' AND csop.TOROLT = 'F'
GROUP BY tcs.C_OSZTALYCSOPORTID
END
IF EXISTS (SELECT 1 FROM T_CSOPORT_OSSZES WHERE ID = @pOsztalyCsoportId AND C_OSZTALYBONTASID IS NULL AND TOROLT = 'F') BEGIN
INSERT INTO @Result (Id, Kezdete, Vege) /* Az csoport tanulóinak más csoportjai */
SELECT
tcs.C_OSZTALYCSOPORTID AS Id
,CASE
WHEN MIN(tcs.C_BELEPESDATUM) > MIN(csop.C_BELEPESDATUM) AND MIN(tcs.C_BELEPESDATUM) > @pStartDate THEN MIN(tcs.C_BELEPESDATUM)
WHEN MIN(csop.C_BELEPESDATUM) > MIN(tcs.C_BELEPESDATUM) AND MIN(csop.C_BELEPESDATUM) > @pStartDate THEN MIN(csop.C_BELEPESDATUM)
ELSE @pStartDate
END AS Kezdete -- A három közül a legnagyobb
,CASE
WHEN MAX(ISNULL(tcs.C_KILEPESDATUM, @pEndDate)) < MAX(ISNULL(csop.C_KILEPESDATUM, @pEndDate)) AND MAX(ISNULL(tcs.C_KILEPESDATUM, @pEndDate)) < @pEndDate THEN MIN(ISNULL(tcs.C_KILEPESDATUM, @pEndDate))
WHEN MAX(ISNULL(csop.C_KILEPESDATUM, @pEndDate)) < MAX(ISNULL(tcs.C_KILEPESDATUM, @pEndDate)) AND MAX(ISNULL(csop.C_KILEPESDATUM, @pEndDate)) < @pEndDate THEN MIN(ISNULL(csop.C_KILEPESDATUM, @pEndDate))
ELSE @pEndDate
END AS Vege -- A három közül a legkisebb
FROM T_TANULOCSOPORT_OSSZES tcs
INNER JOIN T_TANULOCSOPORT_OSSZES csop
ON tcs.C_TANULOID = csop.C_TANULOID
AND csop.C_OSZTALYCSOPORTID = @pOsztalyCsoportId
AND csop.C_BELEPESDATUM <= @pEndDate
AND (csop.C_KILEPESDATUM > @pStartDate OR csop.C_KILEPESDATUM IS NULL)
AND csop.TOROLT = 'F'
AND csop.C_BELEPESDATUM <= ISNULL(tcs.C_KILEPESDATUM, @pEndDate) AND ISNULL(csop.C_KILEPESDATUM, @pEndDate) > tcs.C_BELEPESDATUM
INNER JOIN T_OSZTALYCSOPORT_OSSZES ocs ON ocs.ID = tcs.C_OSZTALYCSOPORTID AND ocs.TOROLT='F' AND ocs.C_FELADATKATEGORIAID = @kategoriaId
WHERE tcs.C_TANEVID = @pTanevId
AND tcs.C_INTEZMENYID = @pIntezmenyId
AND tcs.C_BELEPESDATUM <= @pEndDate
AND (tcs.C_KILEPESDATUM > @pStartDate OR tcs.C_KILEPESDATUM IS NULL)
AND tcs.TOROLT = 'F' AND csop.TOROLT = 'F'
GROUP BY tcs.C_OSZTALYCSOPORTID
IF NOT EXISTS (SELECT 1 FROM @Result WHERE ID = @pOsztalyCsoportId) BEGIN
INSERT INTO @Result (Id, Kezdete, Vege)
SELECT
@pOsztalyCsoportId AS Id
,t.C_KEZDONAP as Kezdete
,t.C_UTOLSONAP as Vege
FROM T_TANEV t
WHERE t.ID = @pTanevId
END
END
RETURN
END
GO