1.
select id_pokoju from rezerwacje where data_przyjazdu>=”1.5.2006” and
data_wyjazdu<=”31.5.2006” group by 1 having sum (data_wyjazdu-data_przyjazdu)<=21;
2.
Selekt distinct nazwisko frm rezerwacje r, statusy s, klienci k, pokoje p, typy_pokoi t where
r.status_id=status_id.s and r.id_klienta=id_klienta.k and r.id_pokoju=id_pokoju.p and
p.typ_id=typ_id.t and nazwa_statusu=”klient wyjechał” and ilość_osob=1 and
data_przyjazdu>=’1.1.07’ and data_wyjazdu<=’21.1.07’;
3.
Create table Temp (typ_id[primary key],suma_pokoi,ile_dob);
Insert into temp (typ_id, suma_pokoi) values
(select typ_id, count(id_pokoju) from pokoje group by typ_id;
Insert into temp (ile_dob) values
(select typ_id, sum(data_wyjazdu-data_przyjazdu) from rezerwacje, pokoje where
data_przyjazdu>=
data żeby spełnic założenie z cwiczenia
and data_wyjazdu
data żeby spełnic
założenie z cwiczenia
);
Selekt typ_id, (ile_dob/92*100)+’%’as wykorzystanie from temp;
4.>>czy klient już figuruje w bazie?
Selekt id_klienta from klienci where imie=’
imie twojego klienta
’ and nazwisko=’
nazwisko
twojego klienta
’ and rok ur=’
wiadomo
’;
Zwraca id klienta jeśli taki istnieje
A gdy nie ma klienta to:
Insert into klienci(id__klienta, imie, nazwisko,rok_ur) values (identity, ’
imie twojego klienta
’,
’
nazwisko twojego klienta
’,1983);
No to szukamy wolnego pokoju
Selekt min(id_pokoju) from pokoje p, typy_pokoi t where p.typ_id=typ_id.t and ilość osob=1
and numer not In (select numer from rezerwacje where data przyjazdu>=’
wymysl,logiczne
mysenie nie boli
’ and data_wyjazdu<=
‘wymysl’
) ;
No to rezerwujemy pokoik dla klienta☺
Insert into rezerwacje (id_rezerwacji,
id_klienta,id_pokoju,cena,data_rezerwacji,data_przyjazdu,data_wyjazdu, status_id)
Values( identity,
pozostałe atrybuty wpiszcie sami, przecież nie możecie mieć dokładnie tak
samo, jeśli zaliczyliście ćwiczenia to składnie polecenia chyba znacie :P
);
5.ile razy klient był w hotelu?
Selekt count(id_rezerwacji) from rezerwacje r, klienci k, statusy s
Where k.id_klienta=id_klienta.r and r.status_id=status_id.s and imie=”Kunegunda” and
nazwisko=”brzeczyszczykiewicz” and rok_ur=1940 and data_przyjazdu>
’data zgodnie z
poleceniem
’ and nazwa_statusu=”klient wyjechał”;
6. sprawdźmy czy wszyscy goście dotarli do hotelu☺
Selekt imie, nazwisko, id_pokoju, nazwa_statusu from rezerwacje r, klienci k, statusy s
Where r.id_klienta=id_kienta.k and data_przyjazdu=’
zalukaj do zadania o jaka date chodzi
’
And nazwa_statusu=’oczekiwanie na klienta’ And nazwa_statusu=’klient przybył’;
7.
Selekt typy_pokoi, nazwa, sum(cena) from rezerwacje r, pokoje p,
Typy_pokoi t where data_przyjazdu>=’
zalukaj do zadania o jaka date chodzi
’
And data wyjazdu <=’
i tu też
’ group by 1;
8.rachunek
Update rezerwacje set status_id=3 /*klient wyjechał*/ where id_rezerwacji=’43’
Selekt imie, nazwisko, cena, data_przyjazdu, data_wyjazdu from klienci k, rezerwacje r
Where k.id_klienta=id_klienta.r and id rezerwacji=46;
9. najgorsze
Pokarz wszystkie wolne pokoje i zajęte wg kategorii
Wolne pokoje
Create table wolne_pokoje (typ_id,liczba)
Insert into wolne pokoje (typ_id,liczba) values (selekt typ_id, count(*) from rezerwacje,
statusy, pokoje where”
dzisiejsza data
” not between data_przyjazdu and data_wyjazdu and
nazwa statusu=”klient w hotelu” group by 1);
Zajęte pokoje
Create table zajete_pokoje (typ_id,liczba)
Insert into zajete pokoje (typ_id,liczba) values (selekt typ_id, count(*) from rezerwacje,
statusy, pokoje where”
dzisiejsza data
” between data_przyjazdu and data_wyjazdu and nazwa
statusu=”klient w hotelu” group by 1);
Zestawienie
Selekt nazwa_typu w.liczba as [licza wolnych], z.liczba as [liczba zajetycz] from typy_pokoi
t,wolne_pokoje w,zajęte pokoje z where t.typ_id=typ_id.w and t.typ_id=typ_id.z
Czytajcie uważnie co i jak przepisujecie!!!!!
Czytajcie polecenia
Kolejne zadanie opracowane przez Grzegorza
a)
Wypisz działy (NUMDZ, NAZWADZ, i LOK), które mają kierownika (kierowników)
zatrudnionego w firmie po swoim podwładnych i zarabiających więcej niż wynosi
ś
rednia pensja w dziale;
/* Krok 1 – wyliczenie
ś
redniej pensji oraz date ost. zatrudnia w
dz. */
INSERT INTO DZIAŁ_SR (NUMDZ, D_SR_ZAROB, D_OSTATNIE_ZATR)
SELECT NUMDZ, AVG(ZAROB), MAX(ZATRUD) FROM PRAC GROUP BY NUMDZ
/* Krok 2 – wyszukanie pracowników i odpowiadaj
ą
cym im działów */
SELECT DZIAŁ.NUMDZ, DZIAŁ.NAZWADZ, DZIAŁ.LOK
FROM PRAC, DZIAŁ, DZIAŁ_SR
WHERE PRAC.NUMDZ=DZIAŁ.NUMDZ AND PRAC.NUMDZ=DZIAŁ_SR.NUMDZ AND
PRAC.ZAROB > DZIAŁ_SR.D_SR_ZAROB AND
PRAC.ZATRUD=DZIAŁ_SR.D_OSTATNIE_ZATR
b)
Oblicz, jaki procent sumy wszystkich pensji (pensji ogółem) w firmie stanowi pensja
każdego pracownika;
/* Krok 1 – wyliczenie sumy zarobków */
INSERT INTO SUMA_ZAROB (SUMA_ZAROB) SELECT SUM(ZAROB) FROM PRAC;
/* Krok 2 – wyliczenie procentów */
SELECT PRAC.NAZWAP, PRAC.ZAROB/SUMA_ZAROB*100+’%’ AS PROCENT
FROM PRAC, SUMA_ZAROB
c)
Wypisz stanowiska w poszczególnych działach obsadzone przez dwóch lub więcej
pracowników, którzy zarabiają więcej niż wynosi średnia wszystkich pracowników i
którzy zostali zatrudnieni po 12.02.2002 roku.
/* Krok 1 – wyliczenie
ś
redniej wszystkich pracowników */
INSERT INTO PRAC_SR_ZAROB (SR_ZAROB) SELECT AVG(ZAROB) FROM PRAC;
/* Krok 2 – wyszukanie stanowisk
SELECT DZIAŁ.NAZWADZ, PRAC.STANOWISKO
FROM PRAC, DZIAŁ, PRAC_SR_ZAROB
WHERE PRAC.NUMDZ=DZIAŁ.NUMDZ AND
PRAC.ZAROB > PRAC_SR_ZAROB. SR_ZAROB AND PRAC.ZATRUD > ‘2002-02-12’
GROUP BY DZIAŁ.NAZWADZ, PRAC.STANOWISKO
HAVING COUNT(*) >= 2
d)
Wypisz nazwy wszystkich działów wraz z nazwiskami ich kierowników (pracownik
działu, którego stanowisko = KIEROWNIK, w każdym dziale pracuje tylko jeden
kierownik)
SELECT PRAC.NAZWP, DZIAŁ.NAZWADZ
FROM DZIAŁ, PRAC
WHERE PRAC.NUMDZ=DZIAŁ.NUMDZ AND PRAC.STANOWISKO=’KIEROWNIK’
e)
Ustaw pracowników zarabiających ponad 3000$ we wszystkie możliwe pary w ten
sposób, aby po lewej stronie w parze znajdował się pracownik z pensją większą niż
pensja pracownika po prawej stronie. Wypisz wartości NAZWP i ZAROB dla obu
pracowników w parze. Kolumny nazwij następująco NAZWP GÓRNE, GÓRNE,
NAZWP_DOLNE, DOLNE. Posortuj tak, aby wartości w kolumnie GÓRNE były
ustawione od najwyższej do najniższej.
SELECT P1.NAZWP AS [NAZWP GÓRNE], P1.ZAROB AS GÓRNE,
P2.NAZWP AS [NAZWP DOLNE], P2.ZAROB AS DOLNE
FROM PRAC P1, PRAC P2
WHERE P1.ZAROB > 3000 AND P2.ZAROB > 3000 AND P1.ZAROB > P2.ZAROB
ORDER BY 2 DESC
f)
Wskaż wszystkich urzędników, którzy pracują w dziale 10 i których nazwisko nie
rozpoczyna się na literę Z oraz których pensja jest większa niż pensja sprzedawców.
Podaj ID pracownika, nazwisko, stanowisko i zarobki.
/* Krok 1 – wyliczenie
ś
redniej pensji sprzedawców */
INSERT INTO SPRZEDAWCY_SR_ZAROB (SR_ZAROB)
SELECT AVG(ZAROB) FROM PRAC WHERE STANOWISKO=’SPRZEDAWCY’;
/* Krok 2 – wyszukanie urz
ę
dników */
SELECT PRAC.NUMP, PRAC.NAZWP, PRAC.STANOWISKO, PRAC.ZAROB
FROM PRAC, SPRZEDAWCY_SR_ZAROB
WHERE PRAC.NUMDZ=10 AND PRAC.NAZWP NOT LIKE ‘Z%’ AND
PRAC.ZAROB > SPRZEDAWCY_SR_ZAROB.SR_ZAROB
g)
Wskaż pracowników na stanowisku KIEROWNIK, którzy nie maja podwładnych na
stanowisku ANALITYK i których zarobki są większe od zarobków średnich
ANALITYKÓW.
/* Krok 1 – wyliczenie AVG(ZAROB) analityków */
INSERT INTO ANALITYK_SR_ZAROB (SR_ZAROB)
SELECT AVG(ZAROB) FROM PRAC WHERE STANOWISKO=’ANALITYK’;
/* Krok 2 – policzenie analitykow w kazdym dziale */
INSERT INTO DZIAŁ_ANALIT (NUMDZ, ILE_ANALIT)
SELECT NUMDZ, COUNT(NUMP) FROM PRAC
WHERE STANOWISKO=’ANALITYK’ GROUP BY NUMDZ
/* Krok 3 – wyszukanie kierowników */
SELECT PRAC.NUMP, PRAC.NAZWP, PRAC.STANOWISKO
FROM PRAC, DZIAŁ_ANALIT, ANALITYK_SR_ZAROB
WHERE PRAC.STANOWISKO=’KIEROWNIK’ AND
PRAC.NUMDZ=ANALITYK_SR_ZAROB.NUMDZ AND ANALITYK_SR_ZAROB.ILE_ANALIT
= 0 AND
PRAC.ZAROB > ANALITYK_SR_ZAROB.SR_ZAROB
h)
Wyświetli listę zarówno tych pracowników, którzy dostają premię, jak i tych, którzy
mają pensje powyżej średniej.
/* Krok 1 – wyliczenie
ś
redniej pensji */
INSERT INTO PRAC_SR_ZAROB (SR_ZAROB) SELECT AVG(ZAROB) FROM PRAC;
/* Krok 2 – wyszukanie pracowników */
SELECT PRAC.NUMP, PRAC.NAZWP, PRAC.STANOWISKO
FROM PRAC, PREMIE, PRAC_SR_ZAROB
WHERE PREMIE.PROW > 0 OR PRAC.ZAROB > PRAC_SR_ZAROB.SR_ZAROB;
Poprawne opracowanie zadania z normalizacją