none
Comparazione due tabelle ed estrazione di un solo dato (il piu' recente) RRS feed

  • Domanda

  • Buongiorno sono un neofita del linguaggio SQL e non riesco proprio a venire a capo del mio problema...spero che qualcuno sia così generoso da volermi aiutare.

    Problema:

    da un database MSSQL devo estrapolare un inventario originato da due tabelle....una con l'elenco dei prodotti e l'altra con l'elenco dei movimenti di carico e scarico. 

    Vado a spiegarmi meglio:

    tabella A formata da molteplici colonne, fra cui le più importanti sono:

    CODICE -------DESCRIZIONE-------ID.PROD.-------ELIMINATO

    (caratteri)         (caratteri)                (int)                  (bool)

    tabella B formata da molteplici colonne, fra cui le più importanti sono:

    DATA_MOVIMENTO -----GIACENZA-------ID.PROD.

        (caratteri)                (caratteri)             (int) 

    L'ID.PROD. è l'unico legame tra le due tabelle.

    All'interno della tabella B,  l'ID.PROD. si ripete molte volte ed in alcuni casi più movimenti avvengono nella stessa data (nella tabella la data viene memorizzata anche con l'ora), mentre ovviamente nella tabella A è riportato UNA sola volta.

    La colonna ELIMINATO è TRUE se il prodotto risulta cancellato (resta cmq in DB) e viceversa

    Dalla mia interfaccia web io passo solamente una data massima; devo ottenere, come risultato, un inventario FINO  alla data ricevuta dall'utente dei prodotti NON ELIMINATI riportante  CODICE+DESCRIZIONE+GIACENZA dove i vari articoli devono comparire una volta sola con la giacenza più recente.

    Ho provato molte soluzioni che conoscevo e che ho trovato googlando ma proprio non ci arrivo!!!!

    Grazie infinite a chi vorrà aiutarmi.

    giovedì 29 agosto 2019 17:09

Risposte

  • Ciao,

    puoi scrivere la tua query scomponendo il problema: prima determini qual'è il record che identifica l'ultima GIACENZA rilevata per ogni articolo. Poi, metti in join il risultato con la tabella ARTICOLI per applicare i filtri necessari. Riporto sotto un esempio:

    WITH cte as (
    	--classifica i movimenti di giacenza con la funzione di rango ROW_NUMBER e determina il più recente (R=1)
    	SELECT 
    		G.*
    		, ROW_NUMBER() OVER (PARTITION BY ID_PROD ORDER BY DATA_MOVIMENTO DESC) as R
    	FROM dbo.Giacenza G
    	WHERE DATA_MOVIMENTO <= '2019-08-31'
    )
    SELECT A.CODICE, A.DESCRIZIONE, CTE.GIACENZA
    FROM CTE
    	INNER JOIN dbo.ARTICOLO A ON A.ID_PROD = CTE.ID_PROD
    WHERE CTE.R = 1		--filtra solo il movimento di giacenza più recente
    AND A.ELIMINATO = 0	--filtra solo gli articoli non eliminati


    HTH,

    Cris

    Please Mark This As Answer if it solved your issue or Vote This As Helpful if it helps to solve your issue. Thank you!


    sabato 31 agosto 2019 10:11

Tutte le risposte

  • Ciao,

    puoi scrivere la tua query scomponendo il problema: prima determini qual'è il record che identifica l'ultima GIACENZA rilevata per ogni articolo. Poi, metti in join il risultato con la tabella ARTICOLI per applicare i filtri necessari. Riporto sotto un esempio:

    WITH cte as (
    	--classifica i movimenti di giacenza con la funzione di rango ROW_NUMBER e determina il più recente (R=1)
    	SELECT 
    		G.*
    		, ROW_NUMBER() OVER (PARTITION BY ID_PROD ORDER BY DATA_MOVIMENTO DESC) as R
    	FROM dbo.Giacenza G
    	WHERE DATA_MOVIMENTO <= '2019-08-31'
    )
    SELECT A.CODICE, A.DESCRIZIONE, CTE.GIACENZA
    FROM CTE
    	INNER JOIN dbo.ARTICOLO A ON A.ID_PROD = CTE.ID_PROD
    WHERE CTE.R = 1		--filtra solo il movimento di giacenza più recente
    AND A.ELIMINATO = 0	--filtra solo gli articoli non eliminati


    HTH,

    Cris

    Please Mark This As Answer if it solved your issue or Vote This As Helpful if it helps to solve your issue. Thank you!


    sabato 31 agosto 2019 10:11
  • Grazie mille...con alcune modifiche è risultata perfetta e sopratutto ho capito molte cose . 

    Ancora grazie 

    lunedì 2 settembre 2019 08:31