Cum funcționează
„Majorare cu 10%” = înmulțire cu 1.1
Trei scrieri dau același rezultat; important e să înțelegi de ce:
| Scris |
Ce înseamnă |
valoare * 1.1 |
valoarea + 10% din ea, într-o singură operație |
valoare + valoare * 0.1 |
explicit: valoarea plus 10% din ea |
valoare + valoare * 10 / 100 |
la fel, cu procentul scris ca fracție |
Și una care nu e corectă, deși pare:
SET valoare = valoare * 10 / 100 -- GREȘIT: da 10% DIN valoare, adica o scade cu 90%
Diferența dintre „majorează cu 10%" și „calculează 10% din" e toată problema. O comandă de
100 devine 110 în primul caz și 10 în al doilea. Rezultatul rămâne un număr credibil, deci
greșeala nu se vede decât dacă compari cu datele de dinainte.
Capcana împărțirii întregi, dacă coloana ar fi întreagă: în Oracle și în multe sisteme,
valoare * 10 / 100 cu valori întregi poate trunchia la fiecare pas. Ordinea contează — înmulțește
întâi, împarte după — iar cel mai sigur e factorul zecimal (* 1.1).
ROUND(..., 2) păstrează două zecimale, în ton cu number(7,2) din structura tabelului. Fără el,
145.50 * 1.1 ar putea ajunge 160.05000000000001, stocat ca atare.
WHERE obligatoriu aici
Spre deosebire de problema #125, unde
enunțul cerea explicit „fiecărui angajat", aici se majorează doar comenzile plătite cash. Fără
WHERE, toate cele 14 comenzi cresc cu 10% — și nu există niciun mesaj de eroare, doar date greșite
pentru totdeauna.
Ordinea cerințelor schimbă rezultatul afișat
Cerința b) afișează valorile de după majorare, dacă rulezi a) prima. Așa e și ordinea din enunț,
deci așa e corect. Dacă ai rula b) înainte de a), aceleași interogări ar da alte numere — motiv
suficient să respecți ordinea din subiect.
O problemă unde ordinea contează și mai brutal (a) șterge exact ce numără b)) e
#140.
Greșeli frecvente
SET valoare = valoare * 10 / 100 — scade valoarea la 10% din ea. Rezultat plauzibil, complet
greșit.
SET valoare = 1.1 — înlocuiește valoarea cu 1.1. Datele originale sunt pierdute.
WHERE uitat — se majorează toate comenzile, inclusiv cele cu cardul.
'Cash' cu majusculă — în Oracle nu potrivește 'cash'; UPDATE afectează zero rânduri și
pare că „nu a funcționat".
UPDATE fără rotunjire — apar valori cu 15 zecimale în coloana de bani.
SET valoare = valoare + 10 — adaugă 10 lei, nu 10 procente. Diferența se vede doar la
comenzile mari.