Torna al Thread

USE tempdb; GO CREATE TABLE #Originale ( [IdOrig] [int] NOT NULL, [Periodicita] [nvarchar](3) NULL, [Desc1] [nvarchar](250) NULL ); CREATE TABLE #Replicata ( [OrigRef] [int] NULL, [Data] date NULL, [Desc2] [nvarchar](250) NULL, [IdReplic] [int] IDENTITY(1,1) NOT NULL ); INSERT #Originale ([IdOrig], [Periodicita], [Desc1]) VALUES (101, N'Set', N'scale'), (102, N'Set', N'temperature'), (103, N'Set', N'addolcitore'), (104, N'Men', N'giardini'), (105, N'Set', N'spese varie'); INSERT #Replicata ([OrigRef], [Data], [Desc2]) VALUES (101, '20150331', N'scale'), (101, '20150407', N'scale'), (102, '20150406', N'temperature'), (102, '20150413', N'temperature'), (103, '20150425', N'addolcitore'), (104, '20150310', N'giardini'), (104, '20150410', N'giardini'); -- data di FINE DECLARE @EndDate AS date = '20150531'; -- temp table per il ciclo DECLARE @Operazioni AS TABLE ( IdOrig int NOT NULL , Periodicita char(3) NOT NULL ); DECLARE @Id int = 0; DECLARE @Periodicita char(3) = ''; DECLARE @RefData date; DECLARE @MaxDate AS TABLE ( IdOrig int NOT NULL , Periodicita char(3) NOT NULL , UltimaData date NOT NULL ); DECLARE @DateDaInserire AS table ( IdOrig int NOT NULL , Data date ); -- pre popolamento INSERT INTO @Operazioni (IdOrig, Periodicita) SELECT IdOrig, Periodicita FROM #Originale; -- impostazione massime date INSERT INTO @MaxDate (IdOrig, UltimaData, Periodicita) SELECT O.IdOrig, MAX(R.Data), O.Periodicita FROM #Replicata R JOIN #Originale O ON O.IdOrig = R.OrigRef GROUP BY O.IdOrig, O.Periodicita; WHILE (SELECT COUNT(1) FROM @MaxDate) > 0 BEGIN SELECT TOP 1 @Id = IdOrig, @Periodicita = Periodicita, @RefData = UltimaData FROM @MaxDate; DECLARE @Quit bit = 0; IF @Periodicita = 'Set' BEGIN -- settimanale, ripeto fino a EndDate WHILE @RefData <= @EndDate AND @Quit = 0 BEGIN IF DATEADD(DAY, 7, @RefData) <= @EndDate BEGIN SET @RefData = DATEADD(DAY, 7, @RefData); INSERT INTO @DateDaInserire (IdOrig, Data) VALUES (@Id, @RefData); END ELSE SET @Quit = 1; END; --UPDATE @MaxDate --SET MassimaData = @RefData --WHERE IdOrig = @Id; DELETE FROM @MaxDate WHERE IdOrig = @Id; END; SET @Quit = 0; IF @Periodicita = 'Men' BEGIN -- mensile, ripeto fino a EndDate WHILE @RefData <= @EndDate AND @Quit = 0 BEGIN IF DATEADD(MONTH, 1, @RefData) < @EndDate BEGIN SET @RefData = DATEADD(MONTH, 1, @RefData); INSERT INTO @DateDaInserire (IdOrig, Data) VALUES (@Id, @RefData); END ELSE SET @Quit = 1; END; --UPDATE @MaxDate --SET MassimaData = @RefData --WHERE IdOrig = @Id; DELETE FROM @MaxDate WHERE IdOrig = @Id; END; END; SELECT 'PRIMA', * FROM #Replicata R; INSERT INTO #Replicata (OrigRef, Data, Desc2) SELECT D.IdOrig, D.Data, O.Desc1 FROM @DateDaInserire D JOIN #Originale O ON O.IdOrig = D.IdOrig LEFT JOIN #Replicata R ON R.OrigRef = D.IdOrig AND R.Data = D.Data WHERE R.OrigRef IS NULL; SELECT 'DOPO', * FROM #Replicata R ORDER BY R.OrigRef, R.Data DROP TABLE #Originale; GO DROP TABLE #Replicata; GO
Copyright © dotNetHell.it 2002-2025
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5