Selezionare record la cui somma corrisponde ad un valore

di il
6 risposte

Selezionare record la cui somma corrisponde ad un valore

Buongiorno a tutti.
Ho una tabella fatture della quale riporto un esempio e l'ordinamento in modo discendente:

Numero | Anno | Totale
3 2021 3.000
2 2021 1.500
1 2021 1.200

Vorrei sapere se è possibile fare una query (io non ci arrivo...ma non so se sql lo prevede) dove impostando nella clausola
un valore < 5000
mi restituisca solo le prime 2 righe, ovvero la fattura 3 e 2 e, nel caso ad esempio il valore sia 4.000 solo la fattura 3
Grazie in anticipo.

6 Risposte

  • Re: Selezionare record la cui somma corrisponde ad un valore

    Non è molto chiaro,
    Se il limite è 4000 perché estarre solo il record numero 3
    e non anche il 2 ed 1 la cui somma è 2700.
    Insomma, non è chiaro quali siano le altre condizioni se ce ne sono
  • Re: Selezionare record la cui somma corrisponde ad un valore

    sspintux ha scritto:


    Non è molto chiaro,
    Se il limite è 4000 perché estarre solo il record numero 3
    e non anche il 2 ed 1 la cui somma è 2700.
    Insomma, non è chiaro quali siano le altre condizioni se ce ne sono
    4000 o 5000 (cifre di esempio), rappresenterebbero la differenza tra la somma delle fatture emesse per cliente e quanto già pagato dal cliente stesso.
    Dovrei quindi estrapolare le ultime fatture emesse non ancora saldate. Sto cercando una soluzione per programmare uno scadenzario che mi proponga appunto i documenti ancora da pagare per differenza tra crediti esigibili ed entrate. Mi andrebbe bene come risultato anche semplicemente il n. di record. Dopodichè farei una Select TOP (n. di record restituiti) + 1 sulla tabella fatture per proporre quelle totalmente aperte e quella pagata parzialmente.
  • Re: Selezionare record la cui somma corrisponde ad un valore

    Salve a tutti,

    MaxMag64 ha scritto:


    ...
    Dovrei quindi estrapolare le ultime fatture emesse non ancora saldate.
    ...
    questa informazione, in questo scenario cosi' rappresentato NON e' disponibile, quindi non e' possibile proporre un filtro in questo senso...
    mancano dei pezzi... la tabella "pagamenti" ...

    sautoni romagnoli
    --
    Andrea
  • Re: Selezionare record la cui somma corrisponde ad un valore

    asql ha scritto:




    questa informazione, in questo scenario cosi' rappresentato NON e' disponibile, quindi non e' possibile proporre un filtro in questo senso...
    mancano dei pezzi... la tabella "pagamenti" ...

    sautoni romagnoli
    --
    Andrea
    La tabella pagamenti in realtà la ricavo dai movimenti di prima nota. In parole povere:
    La sum(TotaleFattura) mi restituisce il valore delle fatture emesse per cliente es. 45.000 euro
    La Sum(TotPagamenti) mi restituisce l'ammontare dei pagamenti che il cliente ha effettuato es. 40.000 euro
    Con i 5.000 euro di differenza dovrei proporre le ultime fatture ancora da saldare.
    Al momento ci riesco con una variabile tabella, nella quale inserisco le fatture emesse riordinate in modo discendente, scorro le righe ed estrapolo quelle non pagate fino ad esaurimento della differenza.
    Volevo solo capire se esisteva un'istruzione SELECT che mi eviti successivamente di appoggiarmi ad un ciclo while.
  • Re: Selezionare record la cui somma corrisponde ad un valore

    Salve,
    forse ho capito, ma non ci arrivo lo stesso... oppure "non ho capito"

    dici:
    ...
    dove impostando nella clausola un valore < 5000 mi restituisca solo le prime 2 righe, ovvero la fattura 3 e 2 e, nel caso ad esempio il valore sia 4.000 solo la fattura 3
    non riesco a capire...
    viste le fatture
    
    # Anno Valore     $aldo
    1 2021 1.200   =  1.200
    2 2021 1.500   =  2.700
    3 2021 3.000   =  5.700
    
    se passi un parametro di "filtro" = 5.000, allora l'unica fattura "sbilanciata" e' la 3/2021, medesimo risultato per 4.000... a mia conoscenza, non avendo un riferimento su Fatture <-> Pagamenti, direi che le prime ad essere pagate saranno le piu' vecchie e non le piu' nuove...
    l'unico caso dove apparirebbero le fatture 3/2021 e 2/2021 e' per @parametro <= 2.699...
    quindi, ripeto, non mi torna la relazione sui pagamenti.

    Prendendo comunque per "buona" la mia pseudo analisi, e con la popolazione indicata, potremmo ad esempio utilizzare un "Running Total", cioe' la generazione di un Totale aggiornato riga per riga, e scartare alla fine del pre-popolamento, tutte le fatture che NON risultino coperte dal parametro in ingresso...
    trivialmente,
    
    DECLARE @GiaPagato decimal(18, 4) = 5000;
    
    WITH cteRunningTotal AS (
    	-- RunningTotal degli addebiti
    	SELECT Anno,
    		Numero,
    		SUM(Totale) OVER (ORDER BY Anno, Numero) AS RunningTotal
    		FROM Fatture f
    	),
    	cteFattureIncluse AS (
    		-- scarto delle fatture pagate
    		SELECT c.Anno,
    			c.Numero
    			FROM cteRunningTotal c
    			WHERE RunningTotal > @GiaPagato
    	)
    	-- proiezione finale
    	SELECT f.*		
    		FROM cteFattureIncluse c
    		-- anche se QUI in questo caso non serve, utilizzo comunque una JOIN su talella Fatture originali
    		-- perche' probabilmente la tabella originale ha altri attributi che servono in proiezione
    		JOIN Fatture f ON f.Anno = c.Anno
    			AND f.Numero = c.Numero
    		ORDER BY f.Anno DESC, f.Numero DESC;
    --<----------
    Numero      Anno        Totale
    ----------- ----------- ----------
    3           2021        3000.0000
    
    
    se passassi come parametro il valore 2.699 otterremmo
    --<----------
    Numero      Anno        Totale
    ----------- ----------- ---------
    3           2021        3000.0000
    2           2021        1500.0000
    
    con tutto questo, al di la' dell'aggregazione in windowing function, anche se a me risulta coerente il risultato, probabilmente non ho compreso il tuo scenario...

    salutoni romagnoli
    --
    Andrea
  • Re: Selezionare record la cui somma corrisponde ad un valore

    asql ha scritto:


    Salve,
    forse ho capito, ma non ci arrivo lo stesso... oppure "non ho capito"

    dici:
    Ciao Andrea, scusa il ritardo nella risposta ma sono stato incasinato con il lavoro.
    In sostanza lo scenario è quello, l'obiettivo è presentare un report che rappresenta uno scadenzario con le ultime fatture aperte ed una saldata parzialmente.
    Sicuramente la soluzione da te proposta è più elegante ed efficiente.
    Io avevo adottato un paradigma più casereccio, ovvero:
    Calcolavo la differenza tra fatturato e pagato per cliente, appoggiavo su una variabile tabella le fatture in ordine discendente ed infine scorrevo le righe sottraendo alla "@DifferezaDaPagare" il tatale della fattura. In questo modo estrapolavo quelle interamente da saldare ed una parziale.
    Le proverò entrambe. Grazie per tutto.
Devi accedere o registrarti per scrivere nel forum
6 risposte