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