DROP PROCEDURE IF EXISTS uspGetCsoportJelenletAdatok GO CREATE PROCEDURE uspGetCsoportJelenletAdatok @pTanevId int ,@pCsoportId int ,@pTablazatElrendezes int = 0 -- 0: Tanulók adatai vízszintesen, 1: Órák adatai vízszintesen ,@pOsszesitesTipus int = 0 -- 0: Heti rendszerességgel, 1: Havi rendszerességgel AS BEGIN SET NOCOUNT ON; DECLARE @oszlopNevek nvarchar(max) ,@sql nvarchar(max) ,@osszesMegtartottOrakSzama int CREATE TABLE #Tanorak ( ID int ,HetSorszama int ,Datum datetime ,OraKezdete datetime ,Idopont nvarchar(100) ) CREATE TABLE #Tanulok ( ID int ,TanuloNeve nvarchar(510) ) CREATE TABLE #adatokTable ( TanuloId int ,TanuloNeve nvarchar(510) ,Sorszam int ,Idopont nvarchar(100) ,Jeloles nvarchar(100) ) INSERT INTO #Tanorak SELECT tao.ID ,tao.C_HETSORSZAMA ,tao.C_DATUM ,tao.C_ORAKEZDETE ,CONVERT(nvarchar, tao.C_DATUM, 102) + ' (' + LOWER(d.C_NAME) + ') ' + IIF(@pTablazatElrendezes = 0, CHAR(10), '') + ISNULL(CONVERT(nvarchar, tao.C_ORASZAM) + '. óra', CONVERT(nvarchar(5), tao.C_ORAKEZDETE, 114) + '-' + CONVERT(nvarchar(5), tao.C_ORAVEGE, 114)) FROM T_TANITASIORA_OSSZES tao INNER JOIN T_DICTIONARYITEMBASE_OSSZES d ON d.ID = tao.C_HETNAPJA AND d.C_TANEVID = tao.C_TANEVID AND d.TOROLT = 'F' WHERE tao.C_TANEVID = @pTanevId AND tao.C_OSZTALYCSOPORTID = @pCsoportId AND tao.TOROLT = 'F' AND tao.C_MEGTARTOTT = 'T' INSERT INTO #Tanulok SELECT f.ID ,f.C_NYOMTATASINEV FROM T_FELHASZNALO_OSSZES f INNER JOIN T_TANULO_OSSZES t ON t.ID = f.ID AND t.TOROLT = 'F' INNER JOIN fnGetDokumentumOsztalyokCsoportokTanuloi(@pTanevId, @pCsoportId, 'F') cst ON cst.TanuloId = t.ID AND cst.KilepesDatum IS NULL WHERE f.C_TANEVID = @pTanevId AND f.TOROLT = 'F' IF @pOsszesitesTipus = 0 BEGIN DECLARE jelenletCursor CURSOR FOR SELECT C_HETSORSZAMA FROM T_NAPTARIHET_OSSZES nh WHERE nh.TOROLT = 'F' AND nh.C_HETKEZDONAPJA <= GETDATE() AND nh.C_TANEVID = @pTanevId END ELSE BEGIN DECLARE jelenletCursor CURSOR FOR SELECT DISTINCT DATEPART(month, C_HETKEZDONAPJA) AS C_HETSORSZAMA, MIN(C_HETKEZDONAPJA) FROM T_NAPTARIHET_OSSZES nh WHERE nh.TOROLT = 'F' AND nh.C_HETKEZDONAPJA <= GETDATE() AND nh.C_TANEVID = @pTanevId GROUP BY DATEPART(month, C_HETKEZDONAPJA) ORDER BY MIN(C_HETKEZDONAPJA) DECLARE @temp datetime END DECLARE @hetSorszama int OPEN jelenletCursor IF @pOsszesitesTipus = 0 BEGIN FETCH NEXT FROM jelenletCursor INTO @hetSorszama END ELSE BEGIN FETCH NEXT FROM jelenletCursor INTO @hetSorszama, @temp END WHILE @@FETCH_STATUS = 0 BEGIN SET @oszlopNevek = IIF(@pTablazatElrendezes = 0 ,IIF(@pOsszesitesTipus = 0 ,(SELECT STUFF((SELECT ',' + QUOTENAME(Idopont) FROM #Tanorak WHERE HetSorszama = @hetSorszama GROUP BY Datum, OraKezdete, Idopont ORDER BY Datum, OraKezdete FOR XML PATH ('')), 1, 1, '')) ,(SELECT STUFF((SELECT ',' + QUOTENAME(Idopont) FROM #Tanorak WHERE DATEPART(month, Datum) = @hetSorszama GROUP BY Datum, OraKezdete, Idopont ORDER BY Datum, OraKezdete FOR XML PATH ('')), 1, 1, '')) ) ,(SELECT STUFF((SELECT ',' + QUOTENAME(TanuloNeve) FROM #Tanulok ORDER BY TanuloNeve FOR XML PATH ('')), 1, 1, ''))) SET @sql = N' INSERT INTO #adatokTable SELECT tanulo.ID ,tanulo.TanuloNeve ,' + IIF(@pOsszesitesTipus = 0, 'tao.HetSorszama', 'DATEPART(month, tao.Datum)') + N' ,tao.Idopont ,IIF(m.ID IS NULL, ''J'', CASE m.C_TIPUS WHEN 1817 THEN '''' WHEN 1499 THEN ''K'' + CAST(m.C_KESESPERCBEN as nvarchar) + '''' WHEN 1500 THEN IIF(m.C_IGAZOLT = ''T'', ''Hig'', ''H'') END ) AS Jeloles FROM #Tanulok tanulo OUTER APPLY #Tanorak tao LEFT JOIN T_TANULOMULASZTAS_OSSZES m ON m.C_TANITASIORAKID = tao.ID AND m.C_ORATANULOIID = tanulo.ID AND m.TOROLT = ''F'' ' + IIF(@pTablazatElrendezes = 0, '', IIF(@pOsszesitesTipus = 0, N' WHERE tao.HetSorszama = @hetSorszama', N' WHERE DATEPART(month, tao.Datum) = @hetSorszama')) + N' SELECT piv.* ,szumma.Osszesen FROM ( SELECT ' + IIF(@pTablazatElrendezes = 0, 'TanuloNeve', 'Idopont') + N', @hetSorszama AS Sorszam, ' + @oszlopNevek + N' FROM ( SELECT TanuloNeve, Idopont, Jeloles FROM #adatokTable ) AS src PIVOT ( MAX(src.Jeloles) FOR src.' + IIF(@pTablazatElrendezes = 0, 'Idopont', 'TanuloNeve') + N' IN (' + @oszlopNevek + N') ) AS p ) AS piv LEFT JOIN ( SELECT ' + IIF(@pTablazatElrendezes = 0, 'TanuloNeve', 'Idopont') + N', Sorszam , CAST(SUM( case when SUBSTRING(Jeloles, 1, 1) IN (''J'', ''K'') then 1 else 0 end) AS nvarchar(3)) + ''/'' + CAST(SUM( case when SUBSTRING(Jeloles, 1, 1) = ''H'' then 1 else 0 end) AS nvarchar(3)) AS Osszesen FROM #adatokTable GROUP BY ' + IIF(@pTablazatElrendezes = 0, 'TanuloNeve', 'Idopont') + N', Sorszam ) szumma ON szumma.' + IIF(@pTablazatElrendezes = 0, 'TanuloNeve', 'Idopont') + N' = piv.' + IIF(@pTablazatElrendezes = 0, 'TanuloNeve', 'Idopont') + N' AND szumma.Sorszam = piv.Sorszam TRUNCATE TABLE #adatokTable ' EXEC sp_executesql @sql ,N'@pTanevId int ,@pCsoportId int ,@hetSorszama int' ,@pTanevId = @pTanevId ,@pCsoportId = @pCsoportId ,@hetSorszama = @hetSorszama IF @pOsszesitesTipus = 0 BEGIN FETCH NEXT FROM jelenletCursor INTO @hetSorszama END ELSE BEGIN FETCH NEXT FROM jelenletCursor INTO @hetSorszama, @temp END END CLOSE jelenletCursor DEALLOCATE jelenletCursor DECLARE @felevVege datetime ,@utolsoTanitasiNap datetime SELECT @felevVege = FelevVege ,@utolsoTanitasiNap = UtolsoTanitasiNap FROM dbo.fnGetElsoUtolsoTanitasiNapFelevVege(@pTanevId, @pCsoportId) SELECT (SELECT C_HETSORSZAMA FROM T_NAPTARIHET_OSSZES nh WHERE nh.C_TANEVID = @pTanevId AND @felevVege BETWEEN C_HETKEZDONAPJA AND C_HETUTOLSONAPJA) AS FelevHetsorszam ,(SELECT C_HETSORSZAMA FROM T_NAPTARIHET_OSSZES nh WHERE nh.C_TANEVID = @pTanevId AND @utolsoTanitasiNap BETWEEN C_HETKEZDONAPJA AND C_HETUTOLSONAPJA) AS UtolsoTanitasiNapHetsorszam INSERT INTO #adatokTable SELECT tanulo.ID ,tanulo.TanuloNeve ,IIF(tao.Datum <= @felevVege, 0, 1) ,tao.Idopont ,IIF(m.ID IS NULL, 'J', CASE m.C_TIPUS WHEN 1817 THEN '' WHEN 1499 THEN 'J' WHEN 1500 THEN 'H' END ) AS Jeloles FROM #Tanulok tanulo OUTER APPLY #Tanorak tao LEFT JOIN T_TANULOMULASZTAS_OSSZES m ON m.C_TANITASIORAKID = tao.ID AND m.C_ORATANULOIID = tanulo.ID AND m.TOROLT = 'F' SET @oszlopNevek = (SELECT STUFF((SELECT DISTINCT ',' + QUOTENAME(Idopont) FROM #adatokTable WHERE Sorszam = 0 ORDER BY ',' + QUOTENAME(Idopont) FOR XML PATH ('')), 1, 1, '')) SET @osszesMegtartottOrakSzama = (SELECT TOP 1 COUNT(Idopont) OVER() FROM #adatokTable WHERE Sorszam = 0 GROUP BY Idopont) IF (@oszlopNevek is not null) BEGIN SET @sql = N' ;WITH PivotData AS ( SELECT a.Sorszam, a.Idopont, a.Jeloles, COUNT(a.Jeloles) AS db FROM #adatokTable a WHERE a.Jeloles <> '''' AND a.Sorszam = 0 GROUP BY a.Sorszam, a.Idopont, a.Jeloles ) SELECT piv.Jeloles, ' + @oszlopNevek + N', j.Osszesen, j.Atlag FROM ( SELECT Sorszam, Jeloles, ' + @oszlopNevek + N' from PivotData PIVOT ( SUM(PivotData.db) FOR PivotData.Idopont IN (' + @oszlopNevek + N') ) AS p ) piv LEFT JOIN ( SELECT Sorszam, Jeloles ,IIF(Jeloles = ''J'', SUM( CASE WHEN Jeloles = ''J'' THEN 1 ELSE 0 END ) ,SUM( CASE WHEN Jeloles = ''H'' THEN 1 ELSE 0 END )) AS Osszesen ,CAST((IIF(Jeloles = ''J'', SUM( CASE WHEN Jeloles = ''J'' THEN 1 ELSE 0 END ) ,SUM( CASE WHEN Jeloles = ''H'' THEN 1 ELSE 0 END ))) / @osszesMegtartottOrakSzama AS numeric(5, 2)) AS Atlag FROM #adatokTable GROUP BY Sorszam, Jeloles ) j ON j.Sorszam = piv.Sorszam AND j.Jeloles = piv.Jeloles ORDER BY j.Jeloles DESC ' END ELSE BEGIN SET @sql = N' SELECT null AS Jeloles ,null as Osszesen ,null as Atlag ' END exec sp_executesql @sql ,N'@osszesMegtartottOrakSzama numeric(5, 2)' ,@osszesMegtartottOrakSzama = @osszesMegtartottOrakSzama -- Ez a rész azért szükséges, mert az SQL Server kb. 680 oszlopot képes kezelni a PIVOT-ban, -- ezért 3 x 300-as blokkokra bontjuk a PIVOT-ot és csak azokat a blokkokat illesszük be, amelyeket kell -- ha ez nem elég akkor további lebontások kellhetnek (4 x 200 stb.) esetleg a felül lévőbe is SELECT DISTINCT DENSE_RANK() OVER(ORDER BY QUOTENAME(Idopont)) AS Id, QUOTENAME(Idopont) AS Oszlop INTO #Oszlopok FROM #adatokTable ORDER BY QUOTENAME(Idopont) DECLARE @OszlopNevek1 nvarchar(max), @OszlopNevek2 nvarchar(max), @OszlopNevek3 nvarchar(max) SELECT @OszlopNevek1 = ISNULL(@OszlopNevek1 + ',', '') + Oszlop FROM #Oszlopok WHERE Id BETWEEN 1 AND 300 ORDER BY Id SELECT @OszlopNevek2 = ISNULL(@OszlopNevek2 + ',', '') + Oszlop FROM #Oszlopok WHERE Id BETWEEN 301 AND 600 ORDER BY Id SELECT @OszlopNevek3 = ISNULL(@OszlopNevek3 + ',', '') + Oszlop FROM #Oszlopok WHERE Id BETWEEN 601 AND 900 ORDER BY Id IF (@oszlopNevek is not null) BEGIN SET @sql = ' WITH PivotData AS ( SELECT a.Idopont, a.Jeloles, COUNT(a.Jeloles) AS db FROM #adatokTable a WHERE a.Jeloles <> '''' GROUP BY a.Idopont, a.Jeloles ) SELECT j.Jeloles' + CHAR(13) + ISNULL(',' + @OszlopNevek1 + CHAR(13), '') + + ISNULL(',' + @OszlopNevek2 + CHAR(13), '') + + ISNULL(',' + @OszlopNevek3 + CHAR(13), '') + ',j.Osszesen, j.Atlag FROM ( SELECT Jeloles, COUNT(Jeloles) AS Osszesen, CAST(1.0 * COUNT(Jeloles) / (SELECT COUNT(Idopont) FROM PivotData) AS numeric(5, 2)) AS Atlag FROM PivotData GROUP BY Jeloles ) j' IF @OszlopNevek1 IS NOT NULL SET @sql += ' LEFT JOIN ( SELECT Jeloles, ' + @OszlopNevek1 + ' FROM ( SELECT * FROM PivotData WHERE Idopont IN (' + REPLACE(REPLACE(@OszlopNevek1, '[', ''''), ']', '''') + ') ) pd PIVOT (SUM(Db) FOR Idopont IN (' + @OszlopNevek1 + ')) AS p ) piv1 ON piv1.Jeloles = j.Jeloles' IF @OszlopNevek2 IS NOT NULL SET @sql += ' LEFT JOIN ( SELECT Jeloles, ' + @OszlopNevek2 + ' FROM ( SELECT * FROM PivotData WHERE Idopont IN (' + REPLACE(REPLACE(@OszlopNevek2, '[', ''''), ']', '''') + ') ) pd PIVOT (SUM(Db) FOR Idopont IN (' + @OszlopNevek2 + ')) AS p ) piv2 ON piv2.Jeloles = j.Jeloles' IF @OszlopNevek3 IS NOT NULL SET @sql += ' LEFT JOIN ( SELECT Jeloles, ' + @OszlopNevek3 + ' FROM ( SELECT * FROM PivotData WHERE Idopont IN (' + REPLACE(REPLACE(@OszlopNevek3, '[', ''''), ']', '''') + ') ) pd PIVOT (SUM(Db) FOR Idopont IN (' + @OszlopNevek3 + ')) AS p ) piv3 ON piv3.Jeloles = j.Jeloles' SET @sql += ' ORDER BY j.Jeloles DESC' END ELSE BEGIN SET @sql = N' SELECT null AS Jeloles ,null as Osszesen ,null as Atlag ' END EXEC sp_executesql @sql END