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
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
perché il 3?
perchè la somma di B è 150, la somma di A è 150 per cui con l'id 3 la differenza è 0
somma progressiva, non di riga, giusto?
esatto progressiva fino ad arrivare ad avere A-B =0
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)
@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
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
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
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 restocodice:SET @somma:=0; SELECT id, data, dare, avere, ( @somma := @somma + dare - avere ) FROM tabela WHERE id_utente = '1' ORDER BY data, id
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
Una delle prime cose che l'informatico impara (o dovrebbe imparare) è la rappresentazione dei numeri, e in particolare dei numeri non-interi.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)
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