sobota, 6 listopada 2010

Kurs Oracle SQL . Funkcje numeryczne

Funkcje numeryczne

ROUND (x,[,y])



Zaokrągla X do Y miejsca po przecinku. Jeśli Y nie zostało podane jest domyślnie ustawiane jako 0.

TRUNC (x,[,y])




Ucina X do Y miejsca po przecinku. Jeśli Y nie zostało podane jest domyślnie ustawiane jako 0.

POWER (x,y)




Podnosi X do potęgi Y

SQRT(x)




Pierwiastek kwadratowy z X.

SIGN(x)




Zwraca wartość 0,1 lub -1 w zależności od znaku liczby X

ABS(x)




Wartość bezwzględna liczby X.

MOD(x,y)




Reszta z dzielenia X przez Y. Jeśli Y = 0 zwraca X


SIN(x), COS(x), TAN(x)




Funkcje trygonometryczne. X podawane w radianach.






Ćwiczenia




  1. Wyświetl nazwisko oraz miesięcznie wynagrodzenie pracownika z dokładnością do 4 miejsca po przecinku
  2. Wyświetl wynagrodzenie pracowników do kwadratu (tak, właśnie tyle zarabia prezes :) )
  3. Wyświetl wynagrodzenie pracowników zaokrąglone oraz ucięte do tysięcy.




Ten temat omawiam na poniższych szkoleniach:
Podstawy Oracle SQL
Podstawy SQL i PL/SQL
Możesz w nich uczestniczyć, a jako czytelnik tego bloga otrzymasz 10% zniżki - poinformuj o tym fakcie konsultanta.

12 komentarzy:

  1. select job_title, job_id, round((min_salary/12),3), trunc((min_salary/12),3) from jobs

    tak wygląda odpowiedź do ćwiczenia 3 ?

    OdpowiedzUsuń
  2. select last_name, round(to_char(salary, 99.999), 0)
    from employees;

    OdpowiedzUsuń
  3. tomz, nie możesz zaokrąglić char'a.
    Jeśli chcesz użyć to_char, musisz zastosować funkcję znakową:

    select rtrim(trunc((salary),-3),000) from employees;

    OdpowiedzUsuń
  4. Panowie, przyjrzałem się uważnie Waszym propozycjom i muszę przyznać, że nie wydają mi się zadowalające, gdyż dają bądź błędne wyniki, bądź występują tam pozycje null'owe. Oto moja propozycja:

    SELECT last_name, ROUND(salary/1000, 0) zaokraglone, TRUNC(salary/1000, 0) uciete FROM employees;

    OdpowiedzUsuń
    Odpowiedzi
    1. Według mnie w trzecim ćwiczeniu chodzi o takie rozwiązanie:

      SELECT last_name, ROUND(salary,-3) as "Zaokraglone", TRUNC(salary,-3) as "Uciete" from employees;

      Nie wiem dlaczego dzielisz przez 1000, dla mnie zaokrąglenie (Z) oraz ucięcie (U) do tysięcy dla przykładowych (P) liczb powinno wyglądać następująco:

      1.
      P: 9400
      Z: 9000
      U: 9000

      2.
      P: 9600
      Z: 10000
      U: 9000

      3.
      P: 9999
      Z: 10000
      U: 9000

      4.
      P: 400
      Z: 0
      U: 0

      Autor powinien moim zdaniem dopisać, że przy funkcjach ROUND(x,[y]) oraz TRUNC(x,[y]) podanie y ujemnego oznacza zaokrąglanie/ucinanie do miejsca y po lewej od przecinka.

      Usuń
    2. moim zdaniem o to chodzilo autorowi, tak czy siak round i trunc maja ujemne parametry y, ktore bardzo czesto sie stosuje.

      Usuń
  5. select last_name, round(trunc(salary),4)
    from employees;

    Moja logika :P

    OdpowiedzUsuń
  6. w/g mnie powinno być tak:
    select last_name, trunc(round((salary/12),-3),-3) wypalata_mies from employees;

    OdpowiedzUsuń
  7. Dla tych, którzy chcą sprawdzić rozwiązania zadań 1 oraz 2:

    1. Select last_name nazwisko, round(salary/12, 4) zaokrag_miesiecz_wynagrodzenie from employees
    2. Select power(salary/12,2) mies_wynagr_do_kwadratu from employees

    OdpowiedzUsuń
  8. Nie wiem dlaczego w zad. 1 każdy chce zaokrąglać...polecenie jest następujące:
    "Wyświetl nazwisko oraz miesięcznie wynagrodzenie pracownika z dokładnością do 4 miejsca po przecinku". Nie ma tu mowy o zaokrąglaniu do 4 miejsc po przecinku...
    Zatem:
    select last_name, trunc(salary/12,4)
    from employees;

    OdpowiedzUsuń
  9. Jeśli mamy tylko zaokrąglić a nie po prostu uciąć wartości po 4 miejscach po przecinku to wyszło mi tak jak Relatywiście:

    select last_name, round(salary/12, 4) as "miesieczna pensja"
    from employees;

    OdpowiedzUsuń
  10. Przede wszystkim uwaga do kolumny "Salary". Komentarz na kolumnie SALARY w tabeli EMPLOYEES mówi jednoznacznie, że kolumna przechowuje MIESIĘCZNE wynagrodzenie pracownika ("Monthly salary of the employee. Must be greater
    than zero (enforced by constraint emp_salary_min)". Więc jakiekolwiek dzielenie przez 12 jest błędne.

    OdpowiedzUsuń