﻿DROP PROCEDURE IF EXISTS uspGetAtlag
GO

CREATE PROCEDURE uspGetAtlag
   @pOsztalyCsoportId int
  ,@pTantargyId int
  ,@pAtlagMegjelenitesTipus int
  ,@pAtlagbaBeleszamitoOsztalyTipus int
  ,@pErtekelesTipusa int
  ,@pDatum datetime = NULL
  ,@pTanevId int
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
        ,ROUND(SUM(CAST(d.C_VALUE AS float) * CAST(ISNULL(em.C_SULY, 100) AS float) / 100) / SUM(CAST(ISNULL(em.C_SULY, 100) AS float) / 100), 2) AS Atlag
      FROM T_TANULOERTEKELES_OSSZES te
        INNER JOIN T_DICTIONARYITEMBASE_OSSZES d ON d.ID = te.C_ERTEKELESOSZTALYZATID AND d.C_TANEVID = te.C_TANEVID AND d.TOROLT = 'F'
        LEFT JOIN T_ERTEKELESMOD_OSSZES em ON em.ID = te.C_ERTEKELESMODID AND em.C_ALTANEVID = te.C_TANEVID AND em.TOROLT = 'F'
      WHERE te.C_TANTARGYID = @pTantargyId
        AND te.C_TIPUSID = @pErtekelesTipusa
        AND te.C_ERTEKELESOSZTALYZATID IS NOT NULL
        AND te.C_TANEVID = @pTanevId
        AND te.TOROLT = 'F'
        AND te.C_TANULOID IN
        (SELECT C_TANULOID from T_TANULOCSOPORT_OSSZES tcs where tcs.C_OSZTALYCSOPORTID = @pOsztalyCsoportId
          AND tcs.TOROLT = 'F'
          AND C_TANEVID = @pTanevId
          AND tcs.TOROLT = 'F')
      GROUP BY
         te.C_TANTARGYID

    IF (@pAtlagMegjelenitesTipus = 2)
      /* Átlagok átlaga minden tanuló */
      SELECT
         ertekeles.C_TANTARGYID
        ,ROUND(AVG(ertekeles.Atlag), 2) AS Atlag
      FROM (
        SELECT
           te.C_TANTARGYID
          ,te.C_TANULOID
          ,ROUND(SUM(CAST(d.C_VALUE AS float) * CAST(ISNULL(em.C_SULY, 100) AS float) / 100) / SUM(CAST(ISNULL(em.C_SULY, 100) AS float) / 100), 2) AS Atlag
        FROM T_TANULOERTEKELES_OSSZES te
          INNER JOIN T_DICTIONARYITEMBASE_OSSZES d ON d.ID = te.C_ERTEKELESOSZTALYZATID AND d.C_TANEVID = te.C_TANEVID AND d.TOROLT = 'F'
          LEFT JOIN T_ERTEKELESMOD_OSSZES em ON em.ID = te.C_ERTEKELESMODID AND em.C_ALTANEVID = te.C_TANEVID AND em.TOROLT = 'F'
        WHERE te.C_TANTARGYID = @pTantargyId
          AND te.C_TIPUSID = @pErtekelesTipusa
          AND te.C_ERTEKELESOSZTALYZATID IS NOT NULL
          AND te.C_TANEVID = @pTanevId
          AND te.TOROLT = 'F'
        AND te.C_TANULOID IN
        (SELECT C_TANULOID from T_TANULOCSOPORT_OSSZES tcs where tcs.C_OSZTALYCSOPORTID = @pOsztalyCsoportId
          AND tcs.TOROLT = 'F'
          AND C_TANEVID = @pTanevId
          AND tcs.TOROLT = 'F')
        GROUP BY
           te.C_TANTARGYID
          ,te.C_TANULOID
      ) ertekeles
      GROUP BY
         ertekeles.C_TANTARGYID
  END

  IF (@pAtlagbaBeleszamitoOsztalyTipus = 2)
  BEGIN
    IF (@pAtlagMegjelenitesTipus = 1)
      /* Összes jegy átlaga minden tanulóra, aki az osztályban jelenleg van */
      SELECT
         te.C_TANTARGYID
        ,ROUND(SUM(CAST(d.C_VALUE AS float) * CAST(ISNULL(em.C_SULY, 100) AS float) / 100) / SUM(CAST(ISNULL(em.C_SULY, 100) AS float) / 100), 2) AS Atlag
      FROM T_TANULOERTEKELES_OSSZES te
        INNER JOIN T_DICTIONARYITEMBASE_OSSZES d ON d.ID = te.C_ERTEKELESOSZTALYZATID AND d.C_TANEVID = te.C_TANEVID AND d.TOROLT = 'F'
        LEFT JOIN T_ERTEKELESMOD_OSSZES em ON em.ID = te.C_ERTEKELESMODID AND em.C_ALTANEVID = te.C_TANEVID AND em.TOROLT = 'F'
      WHERE te.C_TANTARGYID = @pTantargyId
        AND te.C_TIPUSID = @pErtekelesTipusa
        AND te.C_ERTEKELESOSZTALYZATID IS NOT NULL
        AND te.C_TANEVID = @pTanevId
        AND te.TOROLT = 'F'
        AND te.C_TANULOID IN
        (SELECT C_TANULOID from T_TANULOCSOPORT_OSSZES tcs where tcs.C_OSZTALYCSOPORTID = @pOsztalyCsoportId
          AND C_TANEVID = @pTanevId
          AND tcs.TOROLT = 'F'
          AND tcs.C_BELEPESDATUM <= @pDatum
          AND (tcs.C_KILEPESDATUM > @pDatum OR tcs.C_KILEPESDATUM IS NULL))
      GROUP BY
         te.C_TANTARGYID

    IF (@pAtlagMegjelenitesTipus = 2)
      /* Átlagok átlaga minden tanulóra, aki az osztályban jelenleg van */
      SELECT
         ertekeles.C_TANTARGYID
        ,ROUND(AVG(ertekeles.Atlag), 2) AS Atlag
      FROM (
        SELECT
           te.C_TANTARGYID
          ,te.C_TANULOID
          ,ROUND(SUM(CAST(d.C_VALUE AS float) * CAST(ISNULL(em.C_SULY, 100) AS float) / 100) / SUM(CAST(ISNULL(em.C_SULY, 100) AS float) / 100), 2) AS Atlag
        FROM T_TANULOERTEKELES_OSSZES te
          INNER JOIN T_DICTIONARYITEMBASE_OSSZES d ON d.ID = te.C_ERTEKELESOSZTALYZATID AND d.C_TANEVID = te.C_TANEVID AND d.TOROLT = 'F'
          LEFT JOIN T_ERTEKELESMOD_OSSZES em ON em.ID = te.C_ERTEKELESMODID AND em.C_ALTANEVID = te.C_TANEVID AND em.TOROLT = 'F'
        WHERE te.C_TANTARGYID = @pTantargyId
          AND te.C_TIPUSID = @pErtekelesTipusa
          AND te.C_ERTEKELESOSZTALYZATID IS NOT NULL
          AND te.C_TANEVID = @pTanevId
          AND te.TOROLT = 'F'
        AND te.C_TANULOID IN
        (SELECT C_TANULOID from T_TANULOCSOPORT_OSSZES tcs where tcs.C_OSZTALYCSOPORTID = @pOsztalyCsoportId
          AND C_TANEVID = @pTanevId
          AND tcs.TOROLT = 'F'
          AND tcs.C_BELEPESDATUM <= @pDatum
          AND (tcs.C_KILEPESDATUM > @pDatum OR tcs.C_KILEPESDATUM IS NULL))
        GROUP BY
           te.C_TANTARGYID
          ,te.C_TANULOID
      ) ertekeles
      GROUP BY
         ertekeles.C_TANTARGYID
  END

END

GO

