Advertisement
Guest User

Untitled

a guest
Jul 16th, 2018
113
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
MySQL 9.08 KB | None | 0 0
  1. --zadanie 2
  2.  
  3. --a) Napisz polecenie SQL zwracające siedziby, w których jest tylko jeden wydział.
  4. select siedziby.id_siedziby from siedziby
  5. join wydzialy on wydzialy.id_siedziby = siedziby.ID_SIEDZIBY
  6. group by siedziby.ID_SIEDZIBY having count(wydzialy.id_wydzialu) = 1;
  7. --b) Napisz polecenie SQL zwracające zamówieniamające tylko jedną pozycję.
  8. select id_zamowienia from wiersze_zamowien
  9. group by ID_ZAMOWIENIA having count(id_zamowienia) = 1
  10. order by id_zamowienia;
  11.  
  12. select * from zamowienia z
  13. where z.id_zamowienia in (
  14. select id_zamowienia from wiersze_zamowien
  15. group by ID_ZAMOWIENIA having count(id_zamowienia) = 1)
  16. order by z.id_zamowienia;
  17. --c) Napisz polecenie SQL zwracające pracowników, którzy nie mają podwładnych.
  18. select * from pracownicy p
  19. where p.id_pracownika not in (
  20. select p1.id_szefa from pracownicy p1);
  21.  
  22. SELECT
  23.     ID_PRACOWNIKA,
  24.     IMIE,
  25.     NAZWISKO
  26. FROM
  27.     PRACOWNICY
  28.    
  29. MINUS
  30.  
  31. SELECT
  32.     ID_PRACOWNIKA,
  33.     IMIE,
  34.     NAZWISKO
  35. FROM
  36.     PRACOWNICY
  37. WHERE
  38.     ID_PRACOWNIKA IN (  SELECT
  39.                             ID_SZEFA
  40.                         FROM
  41.                             PRACOWNICY);
  42. --d) Napisz polecenie SQL zwracające wydziały, które nie mają pracowników.
  43.  
  44. select w.id_wydzialu,w.nazwa, count(p.id_pracownika) from wydzialy w
  45. left join PRACOWNICY p on p.ID_WYDZIALU = w.id_wydzialu
  46. group by w.id_wydzialu, w.nazwa having count(p.id_pracownika) < 1;
  47.  
  48. --e) Napisz polecenie SQL zwracające trzech najgorzej zarabiających pracowników.
  49.  
  50. select id_pracownika,imie,nazwisko,pensja from (
  51. select id_pracownika,imie,nazwisko,pensja from pracownicy
  52. order by pensja)
  53. where rownum <=3;
  54.  
  55. --f) Napisz polecenie SQL zwracające zamówienia (identyfikator, data) od klientów pochodzących z miasta BOSTON.
  56.  
  57. select z.id_zamowienia,z.data_zamowienia from zamowienia z
  58. join klienci k on k.id_klienta = z.id_klienta
  59. where k.miasto = 'BOSTON';
  60.  
  61. --zadanie 3
  62.  
  63. --a) Wyświetlić nazwy wyrobów, cenę oraz dochód łączny ze sprzedaży tego wyrobu w poprzednim roku uwzględniając również wyroby, których jeszcze nie udało się sprzedać.
  64.  
  65. select w.id_produktu,w.opis,cn.cena_cennikowa,sum(z.wartosc) from wyroby w
  66. left join CENY cn on w.id_produktu = cn.ID_PRODUKTU
  67. right join WIERSZE_ZAMOWIEN wz on wz.ID_PRODUKTU = w.ID_PRODUKTU
  68. inner join ZAMOWIENIA z on z.ID_ZAMOWIENIA = wz.ID_ZAMOWIENIA
  69. where z.DATA_ZAMOWIENIA < TO_DATE('01/01/01','YY/MM/DD')
  70. group by w.id_produktu,w.opis,cn.cena_cennikowa;
  71.  
  72. --b) Wyświetlić 3 najlepiej sprzedające się wyroby.
  73. select id_produktu, opis,id_zamowienia as ilosc_zamowien from (select w.id_produktu,w.opis,count(z.id_zamowienia) as id_zamowienia from wyroby w
  74. join WIERSZE_ZAMOWIEN wz on wz.ID_PRODUKTU = w.ID_PRODUKTU
  75. join ZAMOWIENIA z on z.ID_ZAMOWIENIA = wz.ID_ZAMOWIENIA
  76. group by w.id_produktu, w.opis order by count(z.id_zamowienia) desc)
  77. where rownum <=3;
  78. --c) Dla każdego miasta, z którego pochodzą klienci wyświetlić jego nazwę, liczbę zamówień oraz średnią kwotę zamówień. Należy przy tym uwzględnić nazwy miast, z których klienci jeszcze nic nie kupili.
  79. select k.miasto,count(z.id_zamowienia),avg(z.wartosc) from klienci k
  80. left join zamowienia z on k.id_klienta = z.ID_KLIENTA
  81. group by k.miasto;
  82.  
  83. --d) Wyświetlić nazwisko, imię, nazwę wydziału oraz obroty (sumę zamówień) sprzedawcy, który miał najmniejsze obroty.
  84. select nazwisko,imie,nazwa_wydzialu,suma_zamowien from
  85. (select p.nazwisko,p.imie,w.nazwa as nazwa_wyrobu,sum(z.wartosc) as suma_zamowien from pracownicy p
  86. join klienci k on k.ID_PRACOWNIKA = p.ID_PRACOWNIKA
  87. join zamowienia z on z.id_klienta = k.id_klienta
  88. join wydzialy w on w.id_wydzialu = p.id_wydzialu
  89. group by p.nazwisko,p.imie,w.nazwa
  90. order by sum(z.wartosc))
  91. where rownum <= 1;
  92.  
  93. --e) Wyświetlić nazwisko, imię, nazwę wydziału oraz obroty (sumę zamówień) sprzedawcy, który miał największe obroty.
  94. select nazwisko, imie, nazwa_wydzialu,obroty from
  95. (select p.nazwisko,p.imie, w.nazwa as nazwa_wydzialu,sum(z.wartosc) as obroty from pracownicy p
  96. join klienci k on k.id_pracownika = p.id_pracownika
  97. join ZAMOWIENIA z on z.id_klienta = k.id_klienta
  98. join wydzialy w on w.id_wydzialu = p.id_wydzialu
  99. group by p.nazwisko,p.imie, w.nazwa order by sum(z.wartosc) desc)
  100. where rownum <=1;
  101. --f) Wyświetl średnią płacę pracowników pracujących na poszczególnych etatach. Lista powinna zawierać także etaty, na których nie pracuje żaden pracownik.
  102. select avg(p.pensja),e.etat from pracownicy p
  103. right join ETATY e on p.ID_ETATU = e.ID_ETATU
  104. group by e.ETAT;
  105.  
  106. --zadanie 4
  107. --a)Zmniejszyć o 5% płace sprzedawców, którzy sprzedali w ubiegłym miesiącu za mniej niż 500.
  108. update pracownicy
  109. set pensja = pensja * 0.95
  110. where id_pracownika in (select p.id_pracownika from PRACOWNICY p
  111. join klienci k on p.id_pracownika = k.id_pracownika
  112. join ZAMOWIENIA z on z.id_klienta = k.id_klienta
  113. group by p.id_pracownika having sum(z.wartosc) < 500);
  114. --b) Zwiększyć o 2% prowizję sprzedawców, którzy mają przynajmniej jednego podwładnego.
  115. update pracownicy
  116. set prowizja = prowizja *1.02
  117. where id_pracownika in (select p.id_szefa from pracownicy p);
  118. --c) Zwiększyć o 1% prowizję pracownikom, którzy nie pracują w dziale "SALES".
  119.  
  120. update pracownicy
  121. set prowizja = prowizja *1.01
  122. where ID_PRACOWNIKA in(select p.id_pracownika from pracownicy p
  123. join wydzialy w on p.id_wydzialu = w.id_wydzialu
  124. where w.nazwa != 'SALES');
  125.  
  126. --d) Podwyższyć o 10% płacę wszystkim sprzedawcom, którzy mają więcej niż dwóch klientów.
  127. update pracownicy
  128. set pensja = pensja * 1.1
  129. where id_pracownika in (select p.id_pracownika from pracownicy p
  130. join klienci k on k.id_pracownika = p.id_pracownika
  131. group by p.id_pracownika having count(k.id_klienta) >2);
  132. --tutaj w havign nie wiem czy id_klienta czy id_pracownika
  133.  
  134. --e) Zwiększyć o 2% prowizję sprzedawców, którzy mają przynajmniej jednego klienta.
  135. update pracownicy
  136. set prowizja = prowizja*1.02
  137. where id_pracownika in (
  138. select p.id_pracownika from pracownicy p
  139. join klienci k on p.id_pracownika = k.id_pracownika
  140. group by p.id_pracownika having count(k.id_klienta)>1);
  141. --f) Zwiększ limit kredytowy klientom o 10 za każde złożone zamówienie.
  142. update klienci k1
  143. set k1.limit_kredytowy = k1.limit_kredytowy+10*(select count(z.id_zamowienia) from zamowienia z
  144. join klienci k on k.id_klienta = z.id_klienta
  145. where k.id_klienta = k1.id_klienta
  146. group by k.id_klienta);
  147. --czy tutaj to group by jest konieczne?
  148.  
  149. ***
  150.  
  151. --napisz polecenie sql zwracajace identyfikatory zamowien sprzed 2 kwietnia 1990
  152. select z.id_zamowienia,z.data_zamowienia from zamowienia z
  153. where z.data_zamowienia < TO_DATE('1990/04/02','YY/MM/DD')
  154. order by z.data_zamowienia;
  155. --napisz polecenie sql zwracajace regiony, w kotrych nie ma wydzialu "SALES" i "OPERATIONS"
  156. select s.region,w.nazwa from siedziby s
  157. join wydzialy w on w.id_siedziby = s.id_siedziby
  158. where w.NAZWA != 'SALES' AND w.NAZWA != 'OPERATIONS';
  159. --napisz polecenie sql zwracajace ilosc pozycji (wiersz) poszczegolnych zamowien (identyfikator, data,ilosc pozycji)
  160. select wz.id_zamowienia,z.data_zamowienia,count(wz.id_produktu) as ilosc_pozycji from wiersze_zamowien wz
  161. join zamowienia z on z.id_zamowienia = wz.id_zamowienia
  162. group by wz.id_zamowienia,z.data_zamowienia;
  163. --wyswietlic klienta którego pracownik  ma mniejsza pensja od wartości zamówienia
  164. select k.id_klienta,k.nazwa from klienci k
  165. join pracownicy p on p.id_pracownika = k.id_pracownika
  166. join zamowienia z on z.id_klienta = k.id_klienta
  167. where p.pensja < z.WARTOSC
  168. group by k.id_klienta,k.nazwa;
  169.  
  170. --wyswietlic pracwonika ktorego data zatrudnienia bedzie wczesniejsza od najwyzszej pensji oraz bezdie on na tym samym wydziale co donald scott
  171. select p.id_pracownika,p.imie,p.nazwisko,p.pensja,p.DATA_ZATRUDNIENIA from pracownicy p
  172. where p.data_zatrudnienia <(select p1.data_zatrudnienia from pracownicy p1
  173. where p1.id_pracownika in (select id_pracownika from (select p2.id_pracownika
  174. from pracownicy p2
  175. order by p2.pensja desc)
  176. where rownum <=1)) AND p.id_etatu = (select id_etatu from pracownicy
  177. where nazwisko = 'SCOTT' and imie = 'DONALD');
  178.  
  179. --prostsza wersja bez rownum i z mniejszą iloscia podzapytan
  180. select p.id_pracownika,p.imie,p.nazwisko from pracownicy p
  181. where p.DATA_ZATRUDNIENIA<(select data_zatrudnienia from pracownicy
  182. where pensja = (select max(pensja) from pracownicy))
  183. AND
  184. p.id_etatu = (select id_etatu from pracownicy
  185. where nazwisko = 'SCOTT' and IMIE = 'DONALD');
  186.  
  187.  
  188. --podac cene minimalna wyrobu ktorego zamowiono najwiecej
  189. select w.id_produktu,c.CENA_MINIMALNA from wyroby w
  190. join CENY c on c.id_produktu = w.id_produktu
  191. where w.id_produktu in(select id_produktu from(
  192. select id_produktu from wiersze_zamowien
  193. group by id_produktu
  194. order by count(id_produktu) desc)
  195. where rownum <= 1);
  196. --klienci ktorzy zamowieli produkt z basketball w nazwie i pelna nazwa produktu oraz ilosc przekraza 100 a wartosc zamowienia 300
  197.  
  198. --tego nie wiem
  199.  
  200. --zamowienia ktorych wartosc jest wieksza od wartosci sredniej i zostaly wyslane 3 dni pozniej od daty zamowienia
  201. select z.id_zamowienia,z.WARTOSC, (select avg(wartosc) from zamowienia) as srednia from zamowienia z
  202. where z.wartosc > (select avg(wartosc) from zamowienia)
  203. AND
  204. z.DATA_WYSYLKI - z.DATA_ZAMOWIENIA > 3
  205. group by z.id_zamowienia,z.wartosc ;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement