﻿DROP PROCEDURE IF EXISTS uspGetAtlag
GO

CREATE PROCEDURE uspGetAtlag
   @pOsztalyCsoportId int
  ,@pTantargyId int
  ,@pAtlagMegjelenitesTipus int
  ,@pAtlagbaBeleszamitoOsztalyTipus int
  ,@pErtekelesTipusa int
  ,@pDatum datetime = NULL
AS BEGIN
  SET NOCOUNT ON;

  IF @pDatum IS NULL
    SET @pDatum = CONVERT(date, GETDATE())

  IF (@pAtlagbaBeleszamitoOsztalyTipus = 1)
  BEGIN
    IF (@pAtlagMegjelenitesTipus = 1)
      /* Összes jegy átlaga minden tanuló */
      SELECT
         te.C_TANTARGYID
        ,te.C_OSZTALYCSOPORTID
        ,ROUND(SUM(CAST(d.C_VALUE AS float) * CAST(ISNULL(ta.C_SULY, 100) AS float) / 100) / SUM(CAST(ISNULL(ta.C_SULY, 100) AS float) / 100), 2) AS Atlag
      FROM T_TANULOERTEKELES te
        INNER JOIN T_OSZTALYZATTIPUS ot ON te.C_ERTEKELESOSZTALYZATID = ot.ID
        INNER JOIN T_DICTIONARYITEMBASE d ON ot.ID = d.ID
        LEFT JOIN T_TANARIATLAGSULY ta ON te.C_ERTEKELESMODID = ta.C_ERTEKELESMODID
      WHERE te.C_TANTARGYID = @pTantargyId
        AND te.C_OSZTALYCSOPORTID = @pOsztalyCsoportId
        AND te.C_TIPUSID = @pErtekelesTipusa
        AND te.C_ERTEKELESOSZTALYZATID IS NOT NULL
      GROUP BY
         te.C_TANTARGYID
        ,te.C_OSZTALYCSOPORTID

    IF (@pAtlagMegjelenitesTipus = 2)
      /* Átlagok átlaga minden tanuló */
      SELECT
         ertekeles.C_TANTARGYID
        ,ertekeles.C_OSZTALYCSOPORTID
        ,ROUND(AVG(ertekeles.Atlag), 2) AS Atlag
      FROM (
        SELECT
           te.C_TANTARGYID
          ,te.C_OSZTALYCSOPORTID
          ,te.C_TANULOID
          ,ROUND(SUM(CAST(d.C_VALUE AS float) * CAST(ISNULL(ta.C_SULY, 100) AS float) / 100) / SUM(CAST(ISNULL(ta.C_SULY, 100) AS float) / 100), 2) AS Atlag
        FROM T_TANULOERTEKELES te
          INNER JOIN T_OSZTALYZATTIPUS ot ON te.C_ERTEKELESOSZTALYZATID = ot.ID
          INNER JOIN T_DICTIONARYITEMBASE d ON ot.ID = d.ID
          LEFT JOIN T_TANARIATLAGSULY ta ON te.C_ERTEKELESMODID = ta.C_ERTEKELESMODID
        WHERE te.C_TANTARGYID = @pTantargyId
          AND te.C_OSZTALYCSOPORTID = @pOsztalyCsoportId
          AND te.C_TIPUSID = @pErtekelesTipusa
          AND te.C_ERTEKELESOSZTALYZATID IS NOT NULL
        GROUP BY
           te.C_TANTARGYID
          ,te.C_OSZTALYCSOPORTID,te.C_TANULOID
      ) ertekeles
      GROUP BY
         ertekeles.C_TANTARGYID
        ,ertekeles.C_OSZTALYCSOPORTID
  END

  IF (@pAtlagbaBeleszamitoOsztalyTipus = 2)
  BEGIN
    IF (@pAtlagMegjelenitesTipus = 1)
      /* Összes jegy átlaga minden tanulóra, aki az osztályban jelenleg van */
      SELECT
         te.C_TANTARGYID
        ,te.C_OSZTALYCSOPORTID
        ,ROUND(SUM(CAST(d.C_VALUE AS float) * CAST(ISNULL(ta.C_SULY, 100) AS float) / 100) / SUM(CAST(ISNULL(ta.C_SULY, 100) AS float) / 100), 2) AS Atlag
      FROM T_TANULOERTEKELES te
        INNER JOIN T_TANEV Tanev ON Tanev.ID = te.C_TANEVID
        INNER JOIN T_OSZTALYZATTIPUS ot ON te.C_ERTEKELESOSZTALYZATID = ot.ID
        INNER JOIN T_DICTIONARYITEMBASE d ON ot.ID = d.ID
        LEFT JOIN T_TANARIATLAGSULY ta ON te.C_ERTEKELESMODID = ta.C_ERTEKELESMODID
        INNER JOIN T_TANULOCSOPORT tcs ON tcs.C_OSZTALYCSOPORTID = te.C_OSZTALYCSOPORTID AND tcs.C_TANULOID = te.C_TANULOID
          AND tcs.C_BELEPESDATUM <= @pDatum
          AND (tcs.C_KILEPESDATUM > @pDatum OR tcs.C_KILEPESDATUM IS NULL)
      WHERE te.C_TANTARGYID = @pTantargyId
        AND te.C_OSZTALYCSOPORTID = @pOsztalyCsoportId
        AND te.C_TIPUSID = @pErtekelesTipusa
        AND te.C_ERTEKELESOSZTALYZATID IS NOT NULL
      GROUP BY
         te.C_TANTARGYID
        ,te.C_OSZTALYCSOPORTID

    IF (@pAtlagMegjelenitesTipus = 2)
      /* Átlagok átlaga minden tanulóra, aki az osztályban jelenleg van */
      SELECT
         ertekeles.C_TANTARGYID
        ,ertekeles.C_OSZTALYCSOPORTID
        ,ROUND(AVG(ertekeles.Atlag), 2) AS Atlag
      FROM (
        SELECT
           te.C_TANTARGYID
          ,te.C_OSZTALYCSOPORTID
          ,te.C_TANULOID
          ,ROUND(SUM(CAST(d.C_VALUE AS float) * CAST(ISNULL(ta.C_SULY, 100) AS float) / 100) / SUM(CAST(ISNULL(ta.C_SULY, 100) AS float) / 100), 2) AS Atlag
        FROM T_TANULOERTEKELES te
          INNER JOIN T_TANEV Tanev ON Tanev.ID = te.C_TANEVID
          INNER JOIN T_OSZTALYZATTIPUS ot ON te.C_ERTEKELESOSZTALYZATID = ot.ID
          INNER JOIN T_DICTIONARYITEMBASE d ON ot.ID = d.ID
          LEFT JOIN T_TANARIATLAGSULY ta ON te.C_ERTEKELESMODID = ta.C_ERTEKELESMODID
          INNER JOIN T_TANULOCSOPORT tcs ON tcs.C_OSZTALYCSOPORTID = te.C_OSZTALYCSOPORTID AND tcs.C_TANULOID = te.C_TANULOID
            AND tcs.C_BELEPESDATUM <= @pDatum
            AND (tcs.C_KILEPESDATUM > @pDatum OR tcs.C_KILEPESDATUM IS NULL)
        WHERE te.C_TANTARGYID = @pTantargyId
          AND te.C_OSZTALYCSOPORTID = @pOsztalyCsoportId
          AND te.C_TIPUSID = @pErtekelesTipusa
          AND te.C_ERTEKELESOSZTALYZATID IS NOT NULL
        GROUP BY
           te.C_TANTARGYID
          ,te.C_OSZTALYCSOPORTID,te.C_TANULOID
      ) ertekeles
      GROUP BY
         ertekeles.C_TANTARGYID
        ,ertekeles.C_OSZTALYCSOPORTID
  END

END


GO

