/* Csak üres (1817) mulasztások - a legkorábbi maradjon Hiányzás (1500) + üres (1817) (vagy fordítva) - A hiányzás maradjon Késés (1499) + Késés (1499) esetén egybe összeadni a kettő értékét, ha minkettő igazolt vagy igazolatlan, ha különböző akkor az igazoltat hagyjuk meg Késés (1499) + hiányzás (1500) (vagy fordítva) - hiányzás maradjon N * Hiányzás (1500) - Legkorábbi igazolt ha van, egyébként a legkorábbi */ DROP TABLE IF EXISTS #tmp SELECT tm.ID,x.*,dib.C_NAME INTO #tmp FROM( SELECT C_ORATANULOIID ,C_TANITASIORAKID FROM T_TANULOMULASZTAS tm WHERE tm.TOROLT='F' GROUP BY C_ORATANULOIID,C_TANITASIORAKID HAVING COUNT(*)>1) x INNER JOIN T_TANULOMULASZTAS tm ON tm.TOROLT='F' AND tm.C_ORATANULOIID = x.C_ORATANULOIID AND tm.C_TANITASIORAKID = x.C_TANITASIORAKID INNER JOIN T_DICTIONARYITEMBASE dib ON dib.ID=tm.C_TIPUS AND dib.C_TANEVID=tm.C_TANEVID DROP TABLE IF EXISTS #mulasztasok SELECT Count(*) db ,STUFF((SELECT DISTINCT ', ' + C_NAME FROM #tmp WHERE #tmp.C_ORATANULOIID=t.C_ORATANULOIID AND #tmp.C_TANITASIORAKID=t.C_TANITASIORAKID FOR XML PATH('')), 1, 1, '') type ,C_ORATANULOIID ,C_TANITASIORAKID INTO #mulasztasok FROM #tmp t GROUP BY C_ORATANULOIID,C_TANITASIORAKID --================1. Csak üres (1817) mulasztások - a legkorábbi maradjon========================= UPDATE T_TANULOMULASZTAS SET TOROLT='T',LASTCHANGED=GETDATE(),MODIFIER=0 WHERE ID IN ( SELECT ID FROM( SELECT ROW_NUMBER() OVER (PARTITION BY tm.C_ORATANULOIID,tm.C_TANITASIORAKID ORDER BY tm.CREATED ASC) rn,tm.ID FROM #mulasztasok m INNER JOIN T_TANULOMULASZTAS tm ON tm.C_ORATANULOIID=m.C_ORATANULOIID AND tm.C_TANITASIORAKID = m.C_TANITASIORAKID AND tm.TOROLT='F' WHERE m.type = ' Üres') x WHERE x.rn>1) --================2. Hiányzás (1500) + üres (1817) (vagy fordítva) - A hiányzás maradjon========================= UPDATE T_TANULOMULASZTAS SET TOROLT='T',LASTCHANGED=GETDATE(),MODIFIER=0 WHERE ID IN ( SELECT ID FROM( SELECT ROW_NUMBER() OVER (PARTITION BY tm.C_ORATANULOIID,tm.C_TANITASIORAKID ORDER BY tm.C_TIPUS, tm.CREATED ASC) rn,tm.ID FROM #mulasztasok m INNER JOIN T_TANULOMULASZTAS tm ON tm.C_ORATANULOIID=m.C_ORATANULOIID AND tm.C_TANITASIORAKID = m.C_TANITASIORAKID AND tm.TOROLT='F' WHERE m.type = ' Hiányzás, Üres') x WHERE x.rn>1) --================3. Késés (1499) + Késés (1499) esetén egybe összeadni a kettő értékét, ha minkettő igazolt vagy igazolatlan, ha különböző akkor az igazoltat hagyjuk meg========================= UPDATE tm SET C_KESESPERCBEN = szum FROM ( SELECT SUM(C_KESESPERCBEN) szum,tm.C_ORATANULOIID,tm.C_TANITASIORAKID,ISNULL(tm.C_IGAZOLT,'-') C_IGAZOLT FROM #mulasztasok m INNER JOIN T_TANULOMULASZTAS tm ON tm.C_ORATANULOIID = m.C_ORATANULOIID AND tm.C_TANITASIORAKID = m.C_TANITASIORAKID AND tm.TOROLT='F' WHERE m.type = ' Késés' GROUP BY tm.C_ORATANULOIID,tm.C_TANITASIORAKID,ISNULL(tm.C_IGAZOLT,'-')) x INNER JOIN T_TANULOMULASZTAS tm ON tm.C_ORATANULOIID=x.C_ORATANULOIID AND tm.C_TANITASIORAKID=x.C_TANITASIORAKID AND ISNULL(tm.C_IGAZOLT,'-') = x.C_IGAZOLT AND tm.TOROLT='F' UPDATE T_TANULOMULASZTAS SET TOROLT='T',LASTCHANGED=GETDATE(),MODIFIER=0 WHERE ID IN ( SELECT ID FROM( SELECT ROW_NUMBER() OVER (PARTITION BY tm.C_ORATANULOIID,tm.C_TANITASIORAKID ORDER BY tm.C_IGAZOLT DESC, tm.CREATED ASC) rn,tm.ID FROM #mulasztasok m INNER JOIN T_TANULOMULASZTAS tm ON tm.C_ORATANULOIID=m.C_ORATANULOIID AND tm.C_TANITASIORAKID = m.C_TANITASIORAKID AND tm.TOROLT='F' WHERE m.type = ' Késés') x WHERE x.rn>1) --================4. Késés (1499) + hiányzás (1500) (vagy fordítva) - hiányzás maradjon ========================= UPDATE T_TANULOMULASZTAS SET TOROLT='T',LASTCHANGED=GETDATE(),MODIFIER=0 WHERE ID IN ( SELECT ID FROM( SELECT ROW_NUMBER() OVER (PARTITION BY tm.C_ORATANULOIID,tm.C_TANITASIORAKID ORDER BY tm.C_TIPUS, tm.CREATED ASC) rn,tm.ID FROM #mulasztasok m INNER JOIN T_TANULOMULASZTAS tm ON tm.C_ORATANULOIID=m.C_ORATANULOIID AND tm.C_TANITASIORAKID = m.C_TANITASIORAKID AND tm.TOROLT='F' WHERE m.type = ' Hiányzás, Késés') x WHERE x.rn>1) --================5. N * Hiányzás (1500) - Legkorábbi igazolt ha van, egyébként a legkorábbi========================= UPDATE T_TANULOMULASZTAS SET TOROLT='T',LASTCHANGED=GETDATE(),MODIFIER=0 WHERE ID IN ( SELECT ID FROM( SELECT ROW_NUMBER() OVER (PARTITION BY tm.C_ORATANULOIID,tm.C_TANITASIORAKID ORDER BY tm.C_IGAZOLT DESC,tm.CREATED ASC) rn,tm.ID FROM #mulasztasok m INNER JOIN T_TANULOMULASZTAS tm ON tm.C_ORATANULOIID=m.C_ORATANULOIID AND tm.C_TANITASIORAKID = m.C_TANITASIORAKID AND tm.TOROLT='F' WHERE m.type = ' Hiányzás') x WHERE x.rn>1) --==================INDEX=============================== DROP INDEX IF EXISTS T_TANULOMULASZTAS.NCU_TanuloMulasztas_OratanuloiId_TanitasiOrakid CREATE UNIQUE INDEX NCU_TanuloMulasztas_OratanuloiId_TanitasiOrakid ON T_TANULOMULASZTAS( C_ORATANULOIID ,C_TANITASIORAKID ) WHERE TOROLT='F' WITH (FILLFACTOR = 80)