Verifica Variazione dati record precedente

di Anonimizzato25979 il
1 risposte
Ciao,
sto cercando un modo per avere in una queery la verifica di variazione dei dai del recod precedente. (MSSQL SERVER 2014)
esempio
TAVBELLA ARTICOLI
COD | NOME |
01 PIPPO

TABELLA VARIAZIONI
DATA | COD | PREZZO | NOME SEC.
01/01 01 10 PAPERINO
02/01 01 8 PAPERINO
03/01 01 12 PLUTO

quindi vorrei avere come utput se lancio la query in data 03/01
COD | NOME | NUOVO PREZZO | PREZZO PREC | NUOVO NOME SEC. | NOME SEC PREC
01 PIPPO 12 8 PLUTO PAPERINO

quindi vorrei avere come utput se lancio la query in data 02/01
COD | NOME | NUOVO PREZZO | PREZZO PREC
01 PIPPO 8 10


in sostanza la query mi deve restiture la colonna variata e il dato variato.
(ovviamente le varie clausole where ecc le conosco) e le inserirò di conseguenza, ma non so quale funzione usare per estrapolare quanto sopra.

GRAZIE

1 Risposte

  • Salve Federico,
    puoi utilizzare la funzione LAG (https://docs.microsoft.com/it-it/sql/t-sql/functions/lag-transact-sql?view=sql-server-ver15), che nella fuzionalita' di windowing restituisce la riga con offset precedente, e quindi filtrare in base alla data di ricerca...
    considerando il set
    
    INSERT INTO [dbo].[Articoli]
    	VALUES ( '01', 'Pippo' ), ( '02', 'Fede' );
    INSERT INTO [dbo].[Articoli$Variazioni]
    	VALUES  ( '2019-01-01', '01', 10, 'Paperino' ), ( '2019-01-02', '01', 8, 'Paperino' ), ( '2019-01-03', '01', 12, 'Pluto' )
    		,	( '2019-01-01', '02', 1, 'a' ), ( '2019-01-02', '02', 2, 'b' ), ( '2019-01-03', '02', 3, 'c' )
    
    puoi trivialmene scrivere
    
    DECLARE @data date = '2019-01-03';
    DECLARE @Cod varchar(5) = '01';
    WITH cte AS (
    	SELECT a.[Cod]
            , av.[Data]
    		, av.[NomeSec] AS [Nome Corrente]
    		, LAG( av.[NomeSec], 1, [NomeSec]) OVER (ORDER BY a.[Cod], av.[Data]) AS [Nome Precedente]
    
    		, av.[Prezzo] AS [Prezzo Corrente]		
    		, LAG( av.[Prezzo], 1, av.[Prezzo]) OVER (ORDER BY a.[Cod], av.[Data]) AS [Prezzo Precedente]
            FROM [dbo].[Articoli] a
    			JOIN [dbo].[Articoli$Variazioni] av ON av.[Cod] = a.[Cod]
    	)
    	SELECT *
    		FROM cte
    		WHERE 
                cte.[Cod] = @Cod
    			AND 
                cte.[Data] = @data;
    
    --/----------------------
    Cod   Data       Nome Corrente Nome Precedente    Prezzo Corrente  Prezzo Precedente
    ----- ---------- ------------- ---------------    ---------------- ------------------
    01    2019-01-03 Pluto         Paperino           12.0000          8.0000
    
    [edit]
    ho modificato la CTE sopra per permettere anche una ricerca per SOLA data senza indicare il Codice di filtro articoli... si puo' ora togliere nella WHERE il filtro cte.[Cod] = @Cod e viene ritornato l'intero parco articoli
    [/edit]

    salutoni omnia
    --
    Andrea
Devi accedere o registrarti per scrivere nel forum
1 risposte