Advertisement
Guest User

Untitled

a guest
Jan 22nd, 2019
66
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 11.07 KB | None | 0 0
  1. -- Lista 9
  2.  
  3. --1. Wypisać nazwiska oraz pensje tych pracowników, którzy (nie) są przełożonymi.
  4.  
  5. SELECT nazwisko,pensja
  6. FROM pracownik p,pracownik_personalia pp
  7. WHERE p.id_pracownika = pp.id_pracownika and p.id_pracownika not in
  8. (SELECT id_przelozonego FROM pracownik WHERE id_przelozonego is not null);
  9.  
  10. --2. Podać stanowisko i średnią pensje na tym stanowisku, pod warunkiem że ta średnia jest unikatowa.
  11.  
  12. SELECT stanowisko, CEIL(AVG(pensja))
  13. FROM pracownik p
  14. GROUP BY stanowisko
  15. HAVING AVG(pensja) <> all (SELECT AVG(pensja) FROM pracownik WHERE stanowisko <> p.stanowisko GROUP BY stanowisko);
  16.  
  17. --3. Podać nazwisko pracownika, który: przyjmował dostawę; nie ma najniższej pensji; najwięcej razy
  18. -- pracował przy produkcji towaru.
  19.  
  20. SELECT nazwisko
  21. FROM pracownik_personalia pp ,pracownik p
  22. WHERE pp.id_pracownika = p.id_pracownika and p.id_pracownika = any (SELECT id_pracownika FROM dostawa)
  23. and pensja > any (SELECT pensja FROM pracownik) and p.id_pracownika in (SELECT id_pracownika FROM pracownik_produkcja GROUP BY id_pracownika
  24. HAVING count(*) >= all (SELECT count(*) FROM pracownik_produkcja GROUP BY id_pracownika));
  25.  
  26. --4. Podać stanowisko, na którym pracuje najwięcej osób,
  27. -- które pracowały przy produkcji towaru;
  28.  
  29. SELECT stanowisko
  30. FROM pracownik
  31. WHERE stanowisko in (SELECT stanowisko FROM pracownik_produkcja WHERE id_pracownika in (SELECT id_pracownika FROM pracownik_produkcja))
  32. GROUP BY stanowisko
  33. having count(stanowisko) >= all (SELECT count(*) FROM pracownik WHERE id_pracownika in (SELECT id_pracownika FROM pracownik_produkcja)
  34. GROUP BY stanowisko);
  35.  
  36. -- Lista 10
  37.  
  38. --1. Wypisać stanowisko i sumę zarobków pracowników z tego stanowiska, pod warunkiem że na tym
  39. -- stanowisku pracuje również przełożony, któregokolwiek z tych pracowników
  40.  
  41. SELECT stanowisko, SUM(pensja) Zarobki
  42. FROM pracownik p
  43. WHERE exists (SELECT p1.id_pracownika FROM pracownik p1,pracownik p2
  44. WHERE p1.id_przelozonego = p2.id_pracownika and p1.stanowisko = p2.stanowisko and p1.stanowisko = p.stanowisko)
  45. GROUP BY stanowisko;
  46.  
  47. --2. Podać nazwę działu i nazwisko pracownika, jeżeli jako jedyny zarabia najwięcej w tym dziale
  48.  
  49. SELECT nazwa,nazwisko
  50. FROM dzial d, pracownik_personalia pp, pracownik p
  51. WHERE pp.id_pracownika = p.id_pracownika and d.id_dzialu = p.id_dzialu and not exists
  52. (SELECT id_pracownika FROM pracownik WHERE pensja >= p.pensja and
  53. id_dzialu = d.id_dzialu and id_pracownika <> p.id_pracownika);
  54.  
  55. --3. Podać stanowiska, na których wszystkie pensje są unikatowe.
  56. SELECT stanowisko
  57. FROM pracownik p
  58. WHERE not exists (SELECT pensja FROM pracownik p1 WHERE p1.pensja <> p.pensja and stanowisko = p.stanowisko)
  59. GROUP BY stanowisko;
  60.  
  61. -- Lista 11
  62.  
  63. --1. Podać nazwisko pracownika i liczbę osób pracujących na tym stanowisku, co ten pracownik (pod
  64. -- warunkiem że liczba ta jest większa niż 5). Dane posortować malejąco względem liczby pracowników.
  65.  
  66. SELECT nazwisko, (SELECT count(*) FROM pracownik WHERE stanowisko = p.stanowisko) as ilosc
  67. FROM pracownik_personalia pp, pracownik p
  68. WHERE p.id_pracownika = pp.id_pracownika and (SELECT count(*) FROM pracownik WHERE stanowisko = p.stanowisko) > 5 order by
  69. ilosc ASC;
  70.  
  71. --2. Sprawdzić dla każdego działu, jaki procent wszystkich pracowników stanowią pracownicy tego działu.
  72. -- Podać nazwę działu i procent.
  73.  
  74. SELECT Distinct nazwa, ((SELECT count(*) FROM pracownik WHERE id_dzialu = d.id_dzialu)/(SELECT count(*) FROM
  75. pracownik))*100 || '%' as Procent
  76. FROM dzial d, pracownik p
  77. WHERE d.id_dzialu = p.id_dzialu;
  78.  
  79. --3. Podać procent wykorzystania budżetu na produkcję towarów
  80.  
  81. SELECT (SELECT SUM(stawka*liczba_godzin) FROM pracownik_produkcja)/(SELECT SUM(budzet) FROM produkcja)*100 ||
  82. '%' as Procent
  83. FROM dual;
  84.  
  85. --5. Podać nazwisko pracownika i jego pensję, jeżeli zarabia on najwięcej na swoim stanowisku
  86.  
  87. SELECT nazwisko, pensja
  88. FROM pracownik_personalia pp, pracownik p, (SELECT stanowisko,MAX(pensja) as maks_pensja FROM pracownik group by stanowisko) tab1
  89. WHERE pp.id_pracownika = p.id_pracownika and pensja = maks_pensja and p.stanowisko = tab1.stanowisko;
  90.  
  91. --6. 6. Spośród dostawców, którzy dostarczyli co najmniej 5 produktów, wybrać tych, którzy byli obsługiwani
  92. -- kiedykolwiek przez pracownika zatrudnionego najpóźniej. Podać nazwę dostawcy.
  93.  
  94. --SELECT nazwa
  95. --FROM dostawca d, (SELECT id.dostawcy as id_dos FROM dostawa GROUP BY id_dostawcy having (*) > 5)
  96. -- Niedokończone
  97.  
  98. -- Lista 12
  99.  
  100. --1. Utworzyć perspektywę o nazwie pracownik_dane na podstawie zapytania wypisującego imię,
  101. -- nazwisko, stanowisko i pensję pracownika. Korzystając z utworzonej perspektywy, wpisać dane
  102. -- pracowników, którzy zarabiają powyżej średniej.
  103.  
  104. CREATE VIEW pracownik_dane11 as
  105. SELECT imie,nazwisko,stanowisko,pensja
  106. FROM pracownik p,pracownik_personalia pp
  107. WHERE p.id_pracownika = pp.id_pracownika;
  108.  
  109. SELECT * FROM pracownik_dane11;
  110.  
  111. SELECT imie,nazwisko,pensja
  112. FROM pracownik_dane11
  113. WHERE pensja > (SELECT AVG(pensja) FROM pracownik_dane11);
  114.  
  115. --2. Utworzyć perspektywę wypisującą imię i nazwisko przełożonego oraz jego podwładnego (nazwy pól:
  116. -- przelozony_imie, przelozony_nazwisko, podwladny_imie, podwladny_nazwisko).
  117.  
  118. CREATE VIEW przelozeni111 (imie_przelozonego,nazwisko_przelozonego,imie_podwladnego,nazwisko_podwadnego) as
  119. SELECT pp1.imie,pp1.nazwisko,pp2.imie,pp2.nazwisko
  120. FROM pracownik_personalia pp1,pracownik p2,pracownik_personalia pp2
  121. WHERE p2.id_przelozonego = pp1.id_pracownika and pp2.id_pracownika = p2.id_pracownika;
  122.  
  123. --3. Podać imiona i nazwiska przełożonych, którzy mają więcej niż trzech podwładnych. Wykorzystać
  124. -- perspektywę z zadania 2.
  125.  
  126. SELECT imie_przelozonego, nazwisko_przelozonego
  127. FROM przelozeni111
  128. group by imie_przelozonego, nazwisko_przelozonego
  129. HAVING count(*) > 3;
  130.  
  131. --4. Utworzyć perspektywę, która dla każdego stanowiska wyznaczy maksymalną pensję.
  132.  
  133. CREATE VIEW z4perss (stanowisko,pensja) as
  134. SELECT stanowisko,MAX(pensja)
  135. FROM pracownik p
  136. GROUP BY stanowisko;
  137.  
  138. --6. Podać stanowisko, nazwisko i pensję pracownika zarabiającego najwięcej na swoim stanowisku (pod
  139. -- warunkiem że jest tylko jeden taki pracownik na danym stanowisku). Wykorzystać perspektywę z zadania 4.
  140.  
  141. SELECT p1.stanowisko,nazwisko,p2.pensja
  142. FROM pracownik_dane11 p1,z4perss p2
  143. WHERE p1.pensja = p2.pensja and p1.stanowisko = p2.stanowisko and
  144. (SELECT count(*) FROM pracownik_dane11 WHERE stanowisko = p1.stanowisko and pensja = p2.pensja) = 1;
  145.  
  146. --7. Sprawdzić dla każdego klienta, jaki procent dochodów firmy w danym miesiącu stanowią jego zakupy.
  147. -- Podać imię i nazwisko klienta oraz procent. Wykorzystać odpowiednie perspektywy.
  148.  
  149. CREATE VIEW zad7pers (id_klienta,miesiac,suma) as
  150. SELECT id_klienta,TO_CHAR(data,'MM'), SUM(cena*zz.ilosc)
  151. FROM zamowienie z,zamowienie_szczegoly zz,towar t
  152. WHERE z.id_zamowienia = zz.id_zamowienia and t.nr_towaru = zz.nr_towaru
  153. GROUP BY id_klienta,TO_CHAR(data,'MM');
  154.  
  155. SELECT imie,nazwisko,(SELECT suma FROM zad7pers WHERE id_klienta = k.id_klienta and miesiac = to_char(data,'MM'))
  156. /(SELECT suma FROM zad7pers WHERE miesiac = 12)
  157. FROM klient k, zamowienie z
  158. WHERE k.id_klienta = z.id_klienta and to_char(data,'MM') = 12;
  159.  
  160. --Lista 13
  161.  
  162. --1. Podać imiona i nazwiska klientów, którzy złożyli zamówienie, jeżeli jego kwota jest większą niż 100
  163. --a. lub liczba zamówionych, różnych produktów jest większą niż 10;
  164. --b. i liczba zamówionych, różnych produktów jest większą niż 10;
  165. --c. i liczba zamówionych, różnych produktów jest nie większą niż 10.
  166.  
  167. SELECT imie,nazwisko
  168. FROM klient k, zamowienie z , zamowienie_szczegoly zs, towar t
  169. WHERE k.id_klienta = z.id_klienta and t.nr_towaru = zs.nr_towaru and zs.id_zamowienia = z.id_zamowienia
  170. GROUP BY k.imie,k.nazwisko , z.id_zamowienia
  171. HAVING SUM(zs.ilosc*t.cena) > 100
  172.  
  173. INTERSECT
  174.  
  175. SELECT imie,nazwisko
  176. FROM klient k, zamowienie z , zamowienie_szczegoly zs, towar t
  177. WHERE k.id_klienta = z.id_klienta and t.nr_towaru = zs.nr_towaru and zs.id_zamowienia = z.id_zamowienia
  178. GROUP BY k.imie, k.nazwisko , z.id_zamowienia
  179. HAVING count(*) <= 10;
  180.  
  181. --2. Wypisać dane pracowników według następującego schematu: imię, nazwisko, typ. Pole typ przyjmuje
  182. -- następujące wartości: 2 – pracownik nie ma nad sobą przełożonych, 1 – pracownik jest przełożonym,
  183. -- 0 – pracownik jest podwładnym. Dane posortować malejąco względem typu pracownika.
  184.  
  185. SELECT imie,nazwisko, 2 typ
  186. FROM pracownik_personalia pp, pracownik p
  187. WHERE p.id_pracownika = pp.id_pracownika and p.id_przelozonego is null
  188.  
  189. UNION
  190.  
  191. SELECT imie,nazwisko, 1 typ
  192. FROM pracownik_personalia pp, pracownik p
  193. WHERE p.id_pracownika = pp.id_pracownika and p.id_pracownika in (SELECT id_przelozonego FROM pracownik)
  194.  
  195. UNION
  196.  
  197. SELECT imie,nazwisko, 0 typ
  198. FROM pracownik_personalia pp , pracownik p
  199. WHERE p.id_pracownika = pp.id_pracownika and p.id_przelozonego is not null order by typ;
  200.  
  201. --3. Podać stanowisko, jeżeli żaden pracownik z tego stanowiska nigdy nie brał udziału przy dostawie.
  202.  
  203. SELECT stanowisko
  204. FROM pracownik p
  205.  
  206. MINUS
  207.  
  208. SELECT stanowisko
  209. FROM pracownik p,dostawa d
  210. WHERE p.id_pracownika = d.id_pracownika;
  211.  
  212. --4. Podać nazwę towaru, który był zamawiany co najmniej pięć razy i składa się z co najwyżej trzech
  213. -- składników (, jeżeli każdy z tych towarów, tj. towarów składających się z trzech składników, zawsze był
  214. -- zamawiany przez innego klienta).
  215.  
  216. SELECT nazwa
  217. FROM towar t,zamowienie_szczegoly zs
  218. WHERE zs.nr_towaru = t.nr_towaru
  219. GROUP BY nazwa
  220. HAVING count(*) >= 5
  221.  
  222. INTERSECT
  223.  
  224. (SELECT nazwa
  225. FROM towar t, towar_sklad ts
  226. WHERE ts.nr_towaru = t.nr_towaru
  227. GROUP BY t.nazwa,ts.nr_towaru
  228. HAVING count(*) <= 3
  229.  
  230. MINUS
  231.  
  232. SELECT nazwa
  233. FROM towar t, zamowienie z, zamowienie_szczegoly zs
  234. WHERE t.nr_towaru = zs.nr_towaru and zs.id_zamowienia = z.id_zamowienia
  235. GROUP BY nazwa,z.id_klienta
  236. HAVING count(*) > 1);
  237.  
  238. --1. Utworzyć pomocniczą tabelę, zawierającą następujące dane: identyfikator, imię, nazwisko, pensja oraz
  239. -- stanowisko pracownika. Kolejne zadania wykonać na nowo utworzonej tabeli.
  240.  
  241. CREATE TABLE daned as
  242. SELECT p.id_pracownika, imie , nazwisko, stanowisko,pensja
  243. FROM pracownik p, pracownik_personalia pp
  244. WHERE p.id_pracownika = pp.id_pracownika;
  245.  
  246. SELECT id_pracownika FROM daned p
  247. WHERE pensja = (SELECT MIN(pensja)
  248. FROM daned WHERE stanowisko = p.stanowisko);
  249.  
  250. --2. Zwiększyć o 5% pensje pracowników zarabiających najmniej na swoich stanowiskach.
  251.  
  252. UPDATE daned p
  253. SET pensja = pensja*1.05
  254. WHERE pensja=(SELECT MIN(pensja)
  255. FROM daned WHERE stanowisko = p.stanowisko);
  256.  
  257. SELECT nazwisko,pensja
  258. FROM daned;
  259.  
  260. ALTER TABLE daned ADD przedzial NUMBER (1,0);
  261.  
  262. UPDATE daned
  263. SET przedzial = (SELECT id_przedzialu
  264. FROM przedzial_zarobkow
  265. WHERE pensja between dolna_granica and gorna_granica);
  266.  
  267. DELETE daned
  268. WHERE id_pracownika in (SELECT id_pracownika
  269. FROM pracownik
  270. WHERE premia is not null);
  271.  
  272. ROLLBACK;
  273.  
  274. DELETE daned WHERE id_pracownika in (SELECT p1.id_pracownika FROm pracownik p1, pracownik p2,pracownik_personalia pp
  275. WHERE p1.id_przelzonego = p2.id_pracownika and p2.id_pracownika = pp.id_pracownika and imie || ' ' || nazwisko = '&przelozony');
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement