Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 16
  1. #1
    Utente di HTML.it
    Registrato dal
    Jul 2005
    Messaggi
    909

    [mysql] select sum(a-b)

    Salve,
    questa è la soluzione che ho nel db:

    id A B
    1 0.00 150.00
    2 50.00 0.00
    3 100.00 0.00
    4 200.00 0.00


    Avrei bisogni di estrapolarmi l'id dove la somma totale di A-B ='0.00' in questo caso il record è l'id 3

    Grazie

  2. #2

  3. #3
    Utente di HTML.it
    Registrato dal
    Jul 2005
    Messaggi
    909
    perchè la somma di B è 150, la somma di A è 150 per cui con l'id 3 la differenza è 0

  4. #4
    somma progressiva, non di riga, giusto?

  5. #5
    Utente di HTML.it
    Registrato dal
    Jul 2005
    Messaggi
    909
    esatto progressiva fino ad arrivare ad avere A-B =0

  6. #6
    Utente bannato
    Registrato dal
    Dec 2012
    Messaggi
    679
    SET @somma:=0;
    SELECT id, (@somma := @somma + quello_che_vuoi) FROM ... where ... AND
    ...
    ((@somma)*(@somma)<=eps)


    dove in "eps" ci metti la tua tolleranza per lo zero
    (un minimo di stabilità numerica ci vuole, e la norma 2 non è eccezionale ma meglio di niente)

  7. #7
    Utente di HTML.it
    Registrato dal
    Jul 2005
    Messaggi
    909
    @franzauker2.0..giuro che non l'ho capita, potresti spiegarmela o fare un esempio concreto con le 3 celle ID, A e B?

    Considera che le celle A e B (x semplicità) sono rispettivamente Dare e Avere e il Saldo (calcolato progressivamente tramite query) deve essere 0.00 nè di più nè di meno

    Ciò che mi interessa è sapere con quale ID (inserimento) il saldo si azzera



    intanto grazie per l'interessamento

  8. #8
    Utente bannato
    Registrato dal
    Dec 2012
    Messaggi
    679
    vuoi proprio la pappa fatta, eh?
    Ma da me difficilmente la si ha.
    Inizia così (io vado a magnà)

    SET @somma:=0;
    SELECT id, (@somma := @somma + A-B) FROM tabella

  9. #9
    Utente di HTML.it
    Registrato dal
    Jul 2005
    Messaggi
    909
    non volevo la pappa, ci mancherebbe, giuro che si capiva ben poco da quanto avevi postato soprattutto l'ultima parte ((@somma)*(@somma)<=eps)

    ad ogni modo grazie al tuo prezioso ho fatto un grosso passo avanti, estraggo tutti i record con dare avere e saldo progressivo
    codice:
    SET @somma:=0;
    SELECT id, data, dare, avere, (
    @somma := @somma + dare - avere
    )
    FROM tabela
    WHERE id_utente =  '1'
    ORDER BY data, id
    ora il problema è estrarmi solo i record a partire dall'ID che come Saldo ha valore 0 (nel mio caso il terzultimo record inserito azzera il saldo) per cui dovrebbe partire da quello per farmi visualizzare il resto

    P.S. chiaro è che la condizione del saldo a "0" potrebbe anche non verificarsi per cui in tal caso dovrei cmq poter vedere tutti i record

    Grazie mille

  10. #10
    Utente bannato
    Registrato dal
    Dec 2012
    Messaggi
    679
    Originariamente inviato da yusizu
    non volevo la pappa, ci mancherebbe, giuro che si capiva ben poco da quanto avevi postato soprattutto l'ultima parte ((@somma)*(@somma)<=eps)
    Una delle prime cose che l'informatico impara (o dovrebbe imparare) è la rappresentazione dei numeri, e in particolare dei numeri non-interi.
    Nel caso specifico non è indicato quale sia il tipo di campo (ragionevolmente un decimal (x,2)), ma il ragionamento in generale da fare (anzi mi correggo: fallo come cappero ti pare, visto che c'è il relativismo imperante) è
    "non confrontare elementi non interi tra di loro con uguaglianze".
    chiedersi se X=0, con X non intero (ad esempio float o quello che vuoi) porta spessissimo a devastanti problemini, dovuti alla rappresentazione approssimata di X.
    Il modo "giusto" (giusto... oddio... diciamo che lascio sempre libertà di sbagliare) è quello di adottare una tolleranza di confronto (eps, detto anche epsilon per gli amici,numero intero positivo, piccolo) e definire un intorno.

    Ad esempio "valore assoluto di X minore di 0.001".
    (eps in questo caso è proprio 0.001)
    Ci sono parecchie funzioni adatte, il valore assoluto è uno dei più usati, ma ha il problema di essere una funzione discontinua, mentre la più semplice forma quadratica no (è derivabile ovunque, continua addirittura, insomma è una "buona" funzione.
    Ovvero
    "X al quadrato minore di eps", che poi diventa (sempre per stabilità numerica) "x*x minore di eps"

    Considera che anche i valori tipo DECIMAL vengono "trasferiti" all'applicazione in formati tipicamente non interi (float a loro volta), quasi mai ci sono tipi primitivi in grado di gestirli.

    Riassumendo: come regola generale quando operi con valori non interi non usare espressioni del tipo "somma=0" o simili, giacchè la rappresentazione interna di "somma" può portare - e in generale porta - a errori di stabilità numerica

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.