Dato più recente per dati combinati

di il
10 risposte

Dato più recente per dati combinati

Ciao a tutti,

sono nuovo del forum e ho bisogno del vostro aiuto.

Ho una tabella con le seguenti colonne:

- Codice articolo

- Codice cliente

- Prezzo

- Data listino

Per ogni combinazione di “Codice articolo” e “Codice cliente” devo individure il “Prezzo” con la data listino più recente.

Ho provato ad utilizzare la funzione MAX ma il problema è che ottengo la riga con la data più recente non solo per ogni codice e cliente, ma anche per ogni prezzo. Io vorrei invece soltanto il prezzo della riga con data più recente.

Spero di essermi spiegato.

Grazie a chiunque proverà ad aiutarmi

10 Risposte

  • Re: Dato più recente per dati combinati

    31/07/2023 - nerd_tobe ha scritto:


    . Io vorrei invece soltanto il prezzo della riga con data più recente.

    Ciao,

    puoi specificare meglio ?

    La data listino più recente in assoluto ?

    Oppure la data listino in vigore alla data odierna ?

    Oppure la data listino in vigore ad una certa data da passare ?

    Grazie ;-)  

  • Re: Dato più recente per dati combinati

    Quello che mi serve è il prezzo con la data listino più recente per ogni combinazione articolo-cliente.

  • Re: Dato più recente per dati combinati

    31/07/2023 - nerd_tobe ha scritto:


    Quello che mi serve è il prezzo con la data listino più recente per ogni combinazione articolo-cliente.

    Allora devi :

    1. raggruppare per Articolo/Cliente
    2. ordinare per data ascendente o decrescente 
    3. secondo l'ordinamento scelto, prendere il primo o l'ultimo record e ottieni il prezzo con la data più grande
  • Re: Dato più recente per dati combinati

    Potresti aiutarmi a capire come dovrebbe essere il codice?

    Per ora il mio codice è, banalmente, questo:

    SELECT
    
    Codice_cliente,
    Codice_articolo,
    Prezzo,
    MAX(Data_inizio_validita),
    
    FROM Listini
    GROUP BY 
    Codice_cliente,
    Codice_articolo,
    Prezzo
  • Re: Dato più recente per dati combinati

    Devi fare :

    nella Select metti

    • Cliente
    • Articolo
    • Max Data Listino 
    • Last Prezzo

    nella Group By metti

    • Cliente
    • Articolo

    nella Order By metti

    • Max(Data Listino) (ascendente)

    Se hai necessità di ordinare per Cliente e Articolo 

    aggiungi in Order By (nell'ordine)

    • Cliente
    • Articolo
    • Max(Data Listino)
  • Re: Dato più recente per dati combinati

    In pratica devi scrivere ciò che dici… basta dirlo nel modo corretto e vedrai che lo scriverai altrettanto in modo corretto

    Pertanto:

    • raggruppando per Cliente Articolo
    • prendere ‘l’ultimo prezzo 
    • alla data più grande

    se ti torna quanto detto sopra, quindi se l'hai detto bene a parole, allora lo traduci pari pari in stringa Sql

    ;-)

  • Re: Dato più recente per dati combinati

    Se prendi quanto hai messo nella stringa Sql e lo traduci a parole :

    SELECT
    Codice_cliente,
    Codice_articolo,
    Prezzo,
    MAX(Data_inizio_validita),
    FROM Listini
    GROUP BY 
    Codice_cliente,
    Codice_articolo,
    Prezzo
    • raggruppando per Cliente Articolo e Prezzo
    • seleziona Cliente Articolo Prezzo e la Data più grande

    Quindi si vuole selezionare Cliente/Articolo/Prezzo/Data Massima, raggruppando per Cliente/Articolo/Prezzo
    e il risultato è quello che hai ottenuto e che hai descritto….

    Come vedi è anche un po' difficile tradurlo a parole… capito cosa voglio dire ?

  • Re: Dato più recente per dati combinati

    Salve,

    probabilmente utilizzerei le funzionalita' di windowing disponibili nel linguaggio, quindi generare l'ordinamento per partizionamento codice_cliente + codice_articolo…

    trivialmente,

    USE tempdb;
    GO
    CREATE TABLE dbo.Listini (
    	Codice_cliente int,
    	Codice_articolo int,
    	Prezzo decimal (18,4),
    	Data_inizio_validita datetime
    	);
    GO
    INSERT INTO dbo.Listini
    	VALUES ( 1, 1, 10, '2023-01-01' ), ( 1, 1, 15, '2023-05-01' ), ( 1, 1, 16, '2023-06-01' ), 
    			( 1, 2, 10, '2023-01-01' ), ( 1, 2, 15, '2023-05-01' ), ( 1, 2, 16, '2023-06-01' ),
    			( 2, 1, 10, '2023-01-01' ), ( 2, 1, 15, '2023-05-01' ), ( 2, 1, 16, '2023-06-01' ), 
    			( 2, 2, 10, '2023-01-01' ), ( 2, 2, 15, '2023-05-01' ), ( 2, 2, 16, '2023-06-01' );
    
    WITH cte AS (
    	SELECT l.Codice_cliente, l.Codice_articolo, l.Prezzo, l.Data_inizio_validita
    		, ROW_NUMBER() OVER (PARTITION BY l.Codice_cliente, l.Codice_articolo ORDER BY Data_inizio_validita DESC) rn
    		FROM dbo.Listini l
    	)
    	SELECT *
    		FROM cte c
    		WHERE c.rn = 1;
    
    
    GO
    DROP TABLE dbo.Listini;
    --<-------------
    Codice_cliente Codice_articolo Prezzo                                  Data_inizio_validita    rn
    -------------- --------------- --------------------------------------- ----------------------- --------------------
    1              1               16.0000                                 2023-06-01 00:00:00.000 1
    1              2               16.0000                                 2023-06-01 00:00:00.000 1
    2              1               16.0000                                 2023-06-01 00:00:00.000 1
    2              2               16.0000                                 2023-06-01 00:00:00.000 1

    salutoni romagnoli,
    – 
    Andrea

  • Re: Dato più recente per dati combinati

    31/07/2023 - asql ha scritto:


    OVER (PARTITION BY l.Codice_cliente, l.Codice_articolo

    Ciaooo,

    molto carino, mai capitato di usare … prendo nota… grazie Andrea !!!

  • Re: Dato più recente per dati combinati

    31/07/2023 - asql ha scritto:


    Salve,

    probabilmente utilizzerei le funzionalita' di windowing disponibili nel linguaggio, quindi generare l'ordinamento per partizionamento codice_cliente + codice_articolo…

    trivialmente,

    USE tempdb;
    GO
    CREATE TABLE dbo.Listini (
    	Codice_cliente int,
    	Codice_articolo int,
    	Prezzo decimal (18,4),
    	Data_inizio_validita datetime
    	);
    GO
    INSERT INTO dbo.Listini
    	VALUES ( 1, 1, 10, '2023-01-01' ), ( 1, 1, 15, '2023-05-01' ), ( 1, 1, 16, '2023-06-01' ), 
    			( 1, 2, 10, '2023-01-01' ), ( 1, 2, 15, '2023-05-01' ), ( 1, 2, 16, '2023-06-01' ),
    			( 2, 1, 10, '2023-01-01' ), ( 2, 1, 15, '2023-05-01' ), ( 2, 1, 16, '2023-06-01' ), 
    			( 2, 2, 10, '2023-01-01' ), ( 2, 2, 15, '2023-05-01' ), ( 2, 2, 16, '2023-06-01' );
    
    WITH cte AS (
    	SELECT l.Codice_cliente, l.Codice_articolo, l.Prezzo, l.Data_inizio_validita
    		, ROW_NUMBER() OVER (PARTITION BY l.Codice_cliente, l.Codice_articolo ORDER BY Data_inizio_validita DESC) rn
    		FROM dbo.Listini l
    	)
    	SELECT *
    		FROM cte c
    		WHERE c.rn = 1;
    
    
    GO
    DROP TABLE dbo.Listini;
    --<-------------
    Codice_cliente Codice_articolo Prezzo                                  Data_inizio_validita    rn
    -------------- --------------- --------------------------------------- ----------------------- --------------------
    1              1               16.0000                                 2023-06-01 00:00:00.000 1
    1              2               16.0000                                 2023-06-01 00:00:00.000 1
    2              1               16.0000                                 2023-06-01 00:00:00.000 1
    2              2               16.0000                                 2023-06-01 00:00:00.000 1

    salutoni romagnoli,
    – 
    Andrea

    Esattamente quello che mi serviva!

    Grazie mille a tutti per il supporto

Devi accedere o registrarti per scrivere nel forum
10 risposte