Zadanie 8. Pokaż dniówkę, tygodniówkę, pensję miesięczną i roczną wszystkich pracowników.

Czego się dowiesz czytając ten wpis:

  • poznasz funkcję ROUND i CAST,
  • poznasz klauzulę ORDER BY
  • powtórzysz jak stosować operacje arytmetyczne,
  • powtórzysz wiedzę na temat komend: SELECT i

 

Zadanie 8.

Oblicz ile dany pracownik zarabia dziennie, tygodniowo, miesięcznie i rocznie. Wynik posortuj malejąco. Dane wyświetl w konwencji: Imię i Nazwisko, Dniówka, Tygodniówka, Pensja miesięczna, Pensja roczna.

Rozwiązanie:

Na początek zajmijmy się tylko obliczeniem dniówki. W naszym przykładzie nie będziemy brali pod uwagę dodatków tylko pensję podstawową. Skoro w 2016 r. średnia ilość dni pracy w miesiącu wynosi 21 dni, właśnie taką wartością posłużymy się w zadaniu. Żeby obliczyć dniówkę wystarczy podzielić naszą pensję podstawową przed średnią ilość dni roboczych w miesiącu, w naszym przypadku to 21. Zacznijmy od wyświetlenia imienia i nazwiska, określenia odpowiedniej operacji arytmetycznej do obliczenia dniówki i określenia źródła danych.

1.    SELECT
2.        P.imie + ' ' + P.nazwisko AS [Imię i Nazwisko]
3.       ,P.pensja/23 AS [Dniówka]
4.    FROM
5.       Pracownicy P

Widać, że w źródle danych dla tabeli „Pracownicy” zastosowałem alias P (linia 5), który wykorzystuję w klauzuli SELECT. W drugiej linii dodałem trzy wyrażenia tekstowe imię, nazwisko i spację. Spacja posłużyła mi do tego żeby w wynikach imię i nazwisko było ładnie oddzielone. Dodałem tutaj także alias [Imię i Nazwisko]. Trzecia linia to wyrażenie obliczające dniówkę. Jak wspomniałem wcześniej posłużymy się liczą 21 (średnia ilość dni roboczych w 2016 r.). Obliczenie dniówki to zwykła operacja arytmetyczna, czyli pensja pracownika podzielona przez 21, dodany także alias [Dniówka]. Uruchamiamy. Poniżej pierwsze 3 rekordy (poglądowo).

kurs sql sql course

Wszystko fajnie nam się poobliczało ale w wynikach mamy dość dożą precyzję do 6 miejsc po przecinku. Do zaokrąglenia tego wyniku zastosujemy funkcję ROUND. Więc nasz wiersz z dniówką przybierze postać.

ROUND(P.pensja/23 , 2) AS [Dniówka]

Wynik uruchomienia poniżej.

kurs sql sql course

Krótki komentarz do funkcji ROUND. Zaokrągla nam wynik do wymaganego miejsca po przecinku. Funkcja ta wymaga 2 parametrów.

ROUND( argument1 , argument2 )

Argument 1 to wyrażenie arytmetyczne, w naszym przypadku obliczenie dniówki, natomiast argument 2 to liczbą określająca, do którego miejsca po przecinku chcemy zaokrąglić wynik. Załóżmy, że my chcemy zaokrąglić nasz wynik do drugiego miejsca po przecinku, dlatego jako drugi argument powyżej jest wartość 2.

Zerknij teraz na wynik. Widać, że owszem wynik jest zaokrąglony do dwóch miejsc po przecinku ale dalej po przecinku prezentowanych jest sześć znaków. Aby to „naprawić” zastosujemy drugą funkcję CAST. Ta funkcja służy do konwersji danych jednego typu na inny typ np. typ liczbowy na ciąg znaków, ale możemy ją także zastosować do naszych celów. Poniże definicja funkcji CAST.

CAST( WARTOŚĆ_KONWERTOWANA AS DOCELOWY_TYP_DANYCH 

Za wartość konwertowaną musimy podstawić całe wyrażenie ROUND(P.pensja/23 , 2) a docelowy typ danych ustawiamy na DECIMAL(6,2). Czyli nasze zapytanie w tym momencie będzie wyglądało tak.

SELECT
P.imie + ' ' + P.nazwisko AS [Imiê i Nazwisko]
,CAST(ROUND(P.pensja/23,2) AS DECIMAL(6,2)) AS [Dniówka]
FROM
Pracownicy P

Wynik (3 pierwsze pozycje) uruchomienia zapytania poniżej.

kurs sql sql course

Efekt jest więc osiągnięty. Wartości w kolumnie dniówka są zaokrąglone i wyświetlane do dwóch miejsc po przecinku.

Korzystając z dotychczasowej wiedzy możemy dodać do klauzuli SELECT nowe kolumny. Pozostało nam wyświetlenie kolumny tygodniówka, pensja miesięczna i pensja roczna.

Zajmijmy się linią dotyczącą obliczenia tygodniówki. Do tego celu możemy wykorzystać linię obliczającą dniówkę i lekko ją zmodyfikować. Wystarczy wyrażenie obliczające dniówkę pomnożyć przez liczbę roboczych dni w tygodniu, czyli przez 5.

Pensja miesięczna to nic innego jak wyświetlenie pola „pensja” z tabeli „Pracownicy” a pensja roczna to pensja miesięczna pomnożona przez 12.

Nasze zapytanie przybierze końcową postać.

SELECT
P.imie + ' ' + P.nazwisko AS [Imię i Nazwisko]
,CAST(ROUND(P.pensja/23,2)AS DECIMAL(6,2)) AS [Dniówka]
,CAST(ROUND(P.pensja/23*5,2)AS DECIMAL(6,2)) AS [Tygodniówka]
,P.pensja AS [Pensja miesięczna]
,P.pensja*12 AS [Pensja roczna]
FROM
Pracownicy P

Pozostaje tylko posortować malejąco wyniki naszego zapytania. Do tego służy klauzula ORDER BY. Zaraz po niej podajemy według których kolumn chcemy sortować wyniki i określamy model sortowania malejąco DESC lub rosnąco ASC. W sumie sortowania rosnącego nie musimy deklarować jest to domyślny model sortowania. W naszym przypadku chcemy posortować wyniki malejąco więc dopisujemy na końcu klauzuli DESC. Sortowanie może odbywać się po kilku kolumnach wtedy poszczególne argumenty (kolumny) przedzielamy przecinkiem. W naszym zadania skoro wszystkie wartości w kolumnach zależą od wartości pensji miesięcznej to wystarczy posortować wyniki właśnie po tej kolumnie. Sortować możemy także po aliasach co właśnie wykorzystałem w naszym przykładzie.

SELECT
P.imie + ' ' + P.nazwisko AS [Imię i Nazwisko]
,CAST(ROUND(P.pensja/23,2)AS DECIMAL(6,2)) AS [Dniówka]
,CAST(ROUND(P.pensja/23*5,2)AS DECIMAL(6,2)) AS [Tygodniówka]
,P.pensja AS [Pensja miesiêczna]
,P.pensja*12 AS [Pensja roczna]
FROM
Pracownicy P
Order by
[Pensja miesięczna]DESC

Wynik uruchomienia naszego ostatecznego zapytania poniżej.

kurs sql sql course

poprzedni | następny