Verifica Variazione dati record precedente

di il
1 risposte

Verifica Variazione dati record precedente

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

  • Re: Verifica Variazione dati record precedente

    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