Advertisement
Guest User

alex1

a guest
Apr 24th, 2017
93
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PL/SQL 33.71 KB | None | 0 0
  1.     LAB 2
  2. P1  /*Afisati salarul mediu, minim, maxim precum si suma salariilor grupate pe job si gradul de
  3. salarizare. Sa secalculeze subtotaluri la nivel de job, grad si total general.*/
  4.  
  5. SELECT e.job, s.grade, AVG(e.sal), MIN(e.sal), SUM(e.sal)
  6. FROM emp e, salgrade s
  7. WHERE sal BETWEEN losal AND hisal
  8. GROUP BY rollup(job,grade)
  9.  
  10. P2 /*Adaugati la interogarea anterioara subtotalurile pentru toate combinatiile intre cele doua
  11. dimensiuni: job si gradul de salarizare.*/
  12.  
  13. SELECT e.job, s.grade, AVG(e.sal), MIN(e.sal), SUM(e.sal)
  14. FROM emp e, salgrade s
  15. WHERE sal BETWEEN losal AND hisal
  16. GROUP BY cube(job,grade)
  17.  
  18. P3) Scrieti o interogare care sa afiseze urmatoarele informatii:
  19. - numele managerului, job-ul angajatului, suma salariilor, media salariilor, salarul minim si
  20. maxim, grupate pe manager si job;
  21. -   subtotaluri la nivelul managerului si a jobului, a managerului si totalul general*/
  22.  
  23. SELECT m.ename,e.job, SUM(e.sal), AVG(e.sal), MIN(e.sal), MAX(e.sal)
  24. FROM emp m, emp e
  25. WHERE e.mgr= m.empno
  26. GROUP BY m.ename, rollup(e.job);
  27.  
  28.     P4) /*La interogarea anterioara adaugati functii de grupare care sa identifice care din valorile
  29. NULL afisate sunt generate de extensia clauzei GROUP BY si care sunt din tabele. Pe
  30. coloanele ename si job, pentru valorile NULL generate de extensia clauzei GROUP BY afisati
  31. urmatoarele valori: Total ename, Total job.*/
  32.  
  33. SELECT NVL(m.ename,'total ename'),NVL(e.job,'Total job'), SUM(e.sal), AVG(e.sal), MIN(e.sal), MAX(e.sal),
  34. GROUPING(m.ename) AS gMename, GROUPING(e.job) AS gjob
  35. FROM emp m, emp e
  36. WHERE e.mgr= m.empno
  37. GROUP BY rollup(m.ename,e.job);
  38.  
  39. P5 /*Folosind optiunea GROUPING SETS afisati urmatoarele grupuri:
  40. - nume departament si job
  41. - nume manager si grad salar
  42. Interogarea trebuie sa calculeze suma salariilor. Afisati si nivelul subtotalurilor calculate, iar
  43. valorile NULL generate le afisati cu „Total”. Excludeti eventualele linii duplicate. Ordonati
  44. dupa nivelul subtotalurilor.*/
  45.  
  46. SELECT NVL(d.dname,'total'), NVL(e.job,'total'), NVL(m.ename,'total'),s.grade, SUM(e.sal), GROUPING_ID(d.dname,e.job) AS nivel1,
  47. GROUPING_ID(m.ename,s.grade) AS nivel2, GROUP_ID()
  48. FROM dept d, emp e, emp m, salgrade s
  49. WHERE d.deptno= e.deptno AND
  50.       e.mgr= m.empno AND
  51.       e.sal BETWEEN losal AND hisal
  52.       GROUP BY GROUPING sets ((d.dname,e.job),(m.ename,s.grade))
  53.       HAVING GROUP_ID()=0
  54.       ORDER BY nivel1, nivel2
  55.  
  56. P6 /*Afisati subtotalurile si suma vanzarilor pentru urmatoarele dimensiuni:
  57. – denumirea canalului de distributie (channel_desc), luna de vanzare (calendar_month_desc) si
  58. prescurtarea tarii (country_id);
  59. – filtrati liniile dupa urmatoarele conditii: canalul de distributie sa fie 'Direct Sales' si 'Internet'; luna
  60. de vanzare sa fie '2000-09' si '2000-10', tara de desfacere sa fie 'UK' si 'US'.*/
  61.  
  62. SELECT ch.channel_desc, t.calendar_month_desc,k.country_id, SUM (s.amount_sold)
  63. FROM channels ch, times t, countries k, sales s
  64. WHERE ch.channel_id= s.channel_id AND
  65.       s.time_id=t.time_id AND
  66.       (ch.channel_desc='Direct Sales' OR ch.channel_desc='Internet') AND
  67.       (t.calendar_month_desc='2000-09' OR t.calendar_month_desc='2000-10') AND
  68.       (k.country_id='UK' OR k.country_id='US')
  69.       GROUP BY rollup(ch.channel_desc,t.calendar_month_desc,k.country_id);
  70.  
  71.  
  72.     P7 /*Pentru interogarea anterioara afisati gruparea partiala dupa canalul de distributie.*/
  73.  
  74. SELECT ch.channel_desc, t.calendar_month_desc,k.country_id, SUM (s.amount_sold)
  75. FROM channels ch, times t, countries k, sales s
  76. WHERE ch.channel_id= s.channel_id AND
  77.       s.time_id=t.time_id AND
  78.       (ch.channel_desc='Direct Sales' OR ch.channel_desc='Internet') AND
  79.       (t.calendar_month_desc='2000-09' OR t.calendar_month_desc='2000-10') AND
  80.       (k.country_id='UK' OR k.country_id='US')
  81.       GROUP BY ch.channel_desc, rollup(t.calendar_month_desc,k.country_id);
  82.  
  83.     P8 /*Afisati subtotalurile pentru fiecare combinatie de dimensiuni de la pb 6. Refaceti interogarea si
  84. afisati doar dimensiunile pentru canalul de distributie si tara. Pentru valorile NULL generate de
  85. extensia GROUP BY afisati valorile: 'All countries', respectiv „All channels”.*/
  86.  
  87.  
  88. SELECT NVL(ch.channel_desc,'All channels'),NVL(k.country_id,'all countries'), SUM (s.amount_sold)
  89. FROM channels ch, times t, countries k, sales s
  90. WHERE ch.channel_id= s.channel_id AND
  91.       s.time_id=t.time_id AND
  92.       (ch.channel_desc='Direct Sales' OR ch.channel_desc='Internet') AND
  93.       (t.calendar_month_desc='2000-09' OR t.calendar_month_desc='2000-10') AND
  94.       (k.country_id='UK' OR k.country_id='US')
  95.       GROUP BY cube(ch.channel_desc,t.calendar_month_desc,k.country_id);
  96.  
  97.     P9 /*La problema 8 afisati doar totalurile pe tara, respectiv pe canal, precum si totalul general.*/
  98.  
  99. SELECT NVL(ch.channel_desc,'All channels'),NVL(k.country_id,'all countries'), SUM (s.amount_sold),
  100. GROUPING (ch.channel_desc) AS gchannel, GROUPING(k.country_id) AS gcountry
  101. FROM channels ch, times t, countries k, sales s
  102. WHERE ch.channel_id= s.channel_id AND
  103.       s.time_id=t.time_id AND
  104.       (ch.channel_desc='Direct Sales' OR ch.channel_desc='Internet') AND
  105.       (t.calendar_month_desc='2000-09' OR t.calendar_month_desc='2000-10') AND
  106.       (k.country_id='UK' OR k.country_id='US')
  107.       GROUP BY cube(ch.channel_desc,k.country_id)
  108.       HAVING GROUPING (ch.channel_desc)=1 OR GROUPING(k.country_id)=1;
  109.  
  110.     P10 /*Pentru problema 6 afisati totalul vanzarilor pentru urmatoarele seturi de grupuri de date
  111. ('GROUPING SETS'):
  112. - channel_desc, calendar_month_desc, country_id
  113. - channel_desc, country_id
  114. - calendar_month_desc, country_id)
  115. Conditiile de filtrare si informatiile de afisat raman aceleasi.*/
  116.  
  117.  
  118.  
  119. SELECT ch.channel_desc, t.calendar_month_desc,k.country_id, SUM (s.amount_sold)
  120. FROM channels ch, times t, countries k, sales s
  121. WHERE ch.channel_id= s.channel_id AND
  122.       s.time_id=t.time_id AND
  123.       (ch.channel_desc='Direct Sales' OR ch.channel_desc='Internet') AND
  124.       (t.calendar_month_desc='2000-09' OR t.calendar_month_desc='2000-10') AND
  125.       (k.country_id='UK' OR k.country_id='US')
  126.       GROUP BY GROUPING sets((ch.channel_desc,t.calendar_month_desc,k.country_id),(ch.channel_desc, k.country_id),(calendar_month_desc,k.country_id));
  127.  
  128.    
  129.  
  130.     LAB 3
  131.  
  132.     P 1 /*Afisati clasamentul angajatilor pe departamente dupa data angajarii crescator. Afisati
  133. informatiile: numele departamentului, numele angajatului, data angajarii si pozitia angajatului .*/
  134.  
  135. SELECT d.dname, e.ename,e.hiredate, RANK() over (PARTITION BY d.deptno ORDER BY e.hiredate ASC) Pozitie
  136. FROM emp e, dept d
  137. WHERE e.deptno=d.deptno;
  138.  
  139.     P 2 /*Afisati clasamentul salariilor medii (rotunjit la 2 zecimale) in ordine descrescatoare, pe
  140. departamente. Adaugati si liniile totalizatoare pentru departament si job. Afisati urmatoarele
  141. informatii: numarul departamentului sau „DeptAvgSal”, denumirea job-ului sau „JobAvgSal”,
  142. salarul mediu si pozitia in cadrul departamentului.*/
  143.  
  144.  
  145. SELECT NVL(TO_CHAR(deptno),'DeptAvgSal') AS deptno, NVL(job,'JobAvgSal') AS Jobb,
  146. ROUND(AVG(sal),2) AS mediu,
  147. RANK() over (PARTITION BY deptno ORDER BY AVG(sal) DESC) RANK
  148. FROM emp
  149. GROUP BY rollup(deptno,job);
  150.  
  151.    
  152. P3 /*La interogarea anterioara adaugati si pozitia in cadrul job-ului.*/
  153.  
  154.  
  155.  
  156.  
  157. SELECT NVL(TO_CHAR(deptno),'DeptAvgSal') AS deptno, NVL(job,'JobAvgSal') AS Jobb,
  158. ROUND(AVG(sal),2) AS mediu,
  159. RANK() over (PARTITION BY deptno ORDER BY AVG(sal) DESC) RANK,
  160. RANK() over (PARTITION BY job ORDER BY AVG(sal) DESC) RankJob
  161. FROM emp
  162. GROUP BY rollup(deptno,job);
  163.  
  164.     P4 /*Afisati angajatii cu primele 10 niveluri de venituri (pot sa existe mai mult de 10 angajati).
  165. Venit = salar + comision. Afisati urmatoarele informatii: pozitia angajatului (fara
  166. discontinuitati) in clasamentul veniturilor, numele, salarul, comisionul si venitul.*/
  167.  
  168. SELECT * FROM (SELECT ename,sal,comm, sal+NVL(comm,0) AS venit ,
  169. DENSE_RANK() over (ORDER BY sal+NVL(comm,0) DESC) AS rankk
  170. FROM emp)
  171. WHERE rankk<=10;
  172.  
  173.     P5 /*La exercitiul anterior afisati si distributia veniturilor (rotunjita la 2 zecimale).*/
  174.  
  175. SELECT * FROM (SELECT ename,sal,comm, sal+NVL(comm,0) AS venit ,
  176. DENSE_RANK() over (ORDER BY sal+NVL(comm,0) DESC) AS rankk,
  177. ROUND(CUME_DIST() over (ORDER BY sal+NVL(comm,0) DESC) ,2) DistribVenit
  178. FROM emp)
  179. WHERE rankk<=10;
  180.  
  181.     P6 /*Afisati informatiile despre angajati impartiti in 4 buchete. Afisati urmatoarele informatii:
  182. numarul current, pozitia nivelului de venit, numarul buchetului, numele angajatului, salarul,
  183. comisionul si venitul (salar + commision).*/
  184.  
  185. SELECT ROW_NUMBER() over (ORDER BY sal+NVL(comm,0) DESC) AS CRT,
  186. RANK() over (ORDER BY sal+NVL(comm,0) DESC) AS PozitieVenit,
  187. NTILE(4) over (ORDER BY sal+NVL(comm,0) DESC) AS NTILE,
  188. ename, sal, comm, sal+NVL(comm,0) AS Venit
  189. FROM emp;
  190.  
  191.     P7 /*Afisati clasamentul vanzarilor canalelor de distributie pentru lunile '2000-09' si '2000-10' si
  192. tara US. Informatii: numele canalului, valoarea vanzarilor si pozitia in clasament.*/
  193.  
  194.  
  195.  
  196.  
  197.  
  198. SELECT COUNT(*) FROM (SELECT ch.channel_desc,s.amount_sold,
  199. DENSE_RANK() over (ORDER BY s.amount_sold DESC)
  200. FROM channels ch, sales s,times t, countries k, customers cust
  201. WHERE ch.channel_id=s.channel_id AND
  202.       s.time_id=t.time_id AND
  203.       s.cust_id= cust.cust_id AND
  204.       cust.country_id= k.country_id AND
  205.       (t.calendar_month_desc='2000-09' OR t.calendar_month_desc='2000-10') AND
  206.       k.country_id='US');
  207.  
  208.     P8 /*Afisati clasamentul vanzarilor pe canale de distributie, pentru lunile '2000-08', '2000-09',
  209. '2000-10', '2000-11’. Informatii: channel_desc, calendar_month_desc, total vanzari, pozitia in
  210. cadrul canalului de distributie.*/
  211.  
  212. SELECT ch.channel_desc, t.calendar_month_desc, s.amount_sold,
  213. DENSE_RANK() over (PARTITION BY ch.channel_desc ORDER BY s.amount_sold DESC) Pozitie
  214. FROM channels ch, sales s, times t
  215. WHERE ch.channel_id=s.channel_id AND
  216.       s.time_id=t.time_id AND
  217.       t.calendar_month_desc IN ('2000-08','2000-09','2000-10','2000-11');
  218.  
  219.     P9 /*La interogarea anterioara adaugati si pozitia in cadrul lunii.*/
  220.  
  221. SELECT ch.channel_desc, t.calendar_month_desc, s.amount_sold,
  222. DENSE_RANK() over (PARTITION BY ch.channel_desc ORDER BY s.amount_sold DESC) Pozitie,
  223. RANK() over (ORDER BY t.calendar_month_desc DESC) PozitieLuna
  224. FROM channels ch, sales s, times t
  225. WHERE ch.channel_id=s.channel_id AND
  226.       s.time_id=t.time_id AND
  227.       t.calendar_month_desc IN ('2000-08','2000-09','2000-10','2000-11');
  228.  
  229.     P10 /*Afisati totalul vanzarilor pe canalul de distributie si pe tara impreuna cu pozitionarea in
  230. cadrul acestui grup (channel_desc, country_id), precum si liniile de subtotaluri generate pentru
  231. combinarea celor doua dimensiuni. Se filtreaza liniile pentru canalele: 'Direct Sales', 'Internet',
  232. luna: '2000-09' si tarile: 'UK', 'US', 'JP'. Informatii: channel_desc, country_id, total vanzari,
  233. pozitie in grup.*/
  234.  
  235.  
  236. SELECT ch.channel_desc, SUM(s.amount_sold), k.country_id,
  237. GROUPING (ch.channel_desc) AS gchannel,
  238. GROUPING (k.country_id) AS gcountry,
  239. RANK() over (ORDER BY SUM(s.amount_sold)) rankk
  240. FROM channels ch, sales s, countries k, customers cust, times t
  241. WHERE ch.channel_id=s.channel_id AND
  242.           s.cust_id= cust.cust_id AND
  243.           s.time_id=t.time_id AND
  244.           cust.country_id= k.country_id AND
  245.           ch.channel_desc IN ('Direct Sales', 'Internet')  AND
  246.           t.calendar_month_desc = '2000-09' AND
  247.           k.country_id IN ('UK', 'US', 'JP')
  248. GROUP BY cube(ch.channel_desc,k.country_id);
  249.  
  250. P11 /*Afisati topul primelor 5 tari la vanzari pe luna ‘2000-09’ (tara, total vanzari, pozitie).*/
  251.  
  252. SELECT * FROM(
  253. SELECT k.country_id, SUM(s.amount_sold),
  254.   DENSE_RANK() over (ORDER BY SUM(s.amount_sold) DESC) AS ranktara
  255.   FROM countries k, sales s, customers cust, times t
  256.     WHERE
  257.       s.cust_id=cust.cust_id AND
  258.       cust.country_id=k.country_id AND
  259.       s.time_id=t.time_id AND
  260.       t.calendar_month_desc='2000-09'
  261.       GROUP BY k.country_id
  262. ) WHERE ranktara<=5;
  263.  
  264.     P 12 /*Afisati suma vanzarilor pe anul 1999, pentru categoria de produse ‘Men’, impartite in 4
  265. buchete dupa suma vanzarilor (luna, vanzarile, numar buchet).*/
  266.  
  267. SELECT SUM(s.amount_sold), t.calendar_month_desc,
  268. NTILE(4) over (ORDER BY SUM(s.amount_sold)) AS buchet
  269. FROM sales s, times t, products p
  270. WHERE s.time_id=t.time_id AND
  271.       s.prod_id=p.prod_id AND
  272.       p.prod_category='Men' AND
  273.       t.calendar_year='1999'
  274.     GROUP BY (t.calendar_month_desc);
  275.  
  276.    
  277.  
  278.  
  279.  
  280.             LAB 4
  281. 1) Afisati angajatii si suma salariilor pentru o fereastra cu offset logic, centrata pe data angajarii
  282. cu limitele de plus MINUS o luna. Afisati salarul minim si maxim pentru aceasi fereastra dar cu
  283. limita de plus MINUS 6 luni.
  284.  
  285. SELECT ename,
  286.      SUM(sal) over (ORDER BY hiredate RANGE BETWEEN INTERVAL '1' MONTH  preceding
  287.                                             AND  INTERVAL '1' MONTH following) AS sumsal_center,
  288.      MIN(sal) over (ORDER BY hiredate RANGE BETWEEN INTERVAL '6' MONTH  preceding
  289.                                             AND  INTERVAL '6' MONTH following) AS minsal_center,
  290.      MAX(sal) over (ORDER BY hiredate RANGE BETWEEN INTERVAL '6' MONTH  preceding
  291.                                             AND  INTERVAL '6' MONTH following) AS maxsal_center
  292.      
  293.    FROM emp
  294.  
  295. 2) Afisati numarul departamentului, numele angajatului, salarul si suma salariilor cumulative
  296. pana la angajatul curent pe departamente. Ordonarea se face dupa salar. Se considera fereastra
  297. cu offset fizic si apoi cu offset logic. Comparati rezultatele.
  298.  
  299. --select deptno,ename,sal,
  300.   --      sum(sal) over (partition by deptno order by ename range unbounded preceding) as salCumul
  301.     --    from emp
  302. SELECT deptno,ename,sal,
  303.         SUM(sal) over (PARTITION BY deptno ORDER BY ename rows unbounded preceding) AS salCumul
  304.         FROM emp
  305.  
  306.  
  307. 3) La interogarea anterioara adaugati comisionul si venitul total (salar + comision) si afisati
  308. suma cumulativa a veniturilor. Inlocuiti partitionarea pe departament cu cea pe job. Rulati
  309. interogarea pentru ferestre cu offset fizic si logic.
  310.  
  311. /*select deptno,ename,sal,comm, sal + nvl(comm,0) as Venit,
  312.           sum(sal + nvl(comm,0)) over (partition by job order by ename range unbounded preceding) as salCumul
  313.         from emp */
  314.  SELECT deptno,ename,sal,comm, sal + NVL(comm,0) AS Venit,
  315.           SUM(sal + NVL(comm,0)) over (PARTITION BY job ORDER BY ename rows unbounded preceding) AS salCumul  FROM emp        
  316. /*4) Afisati numarul departamentului, numele, salarul, valoarea functiei fn si suma salariilor
  317. pentru fereastra mobila intre linia curenta si urmatoarele x linii intoarse de fn. Ordonarea se
  318. face dupa departament si salar. Schimbati functia fn cu functia fnjob care intoarce numarul de
  319. angajati pe job minus 1. Schimbati si interogarea astfel incat situatia sa fie pe job in loc de
  320. departament.
  321.  
  322. create or replace function fn(dno number) return number is
  323. Result number;
  324. res number;
  325. begin
  326. select count(*)-1 into res from emp where deptno = dno;
  327. Result := res;
  328. return(Result);
  329. exception
  330. when others then
  331. Result := 0;
  332. end fn;
  333. /
  334. select deptno,ename,sal,fn(deptno),
  335.         sum(sal) over (order by deptno,sal rows BETWEEN CURRENT ROW and fn(deptno) following) sumsal_dept
  336.         from emp */
  337.        
  338.  CREATE OR REPLACE FUNCTION fnjob(djob VARCHAR2) RETURN NUMBER IS
  339. Result NUMBER;
  340. res NUMBER;
  341. BEGIN
  342. SELECT COUNT(*)-1 INTO res FROM emp WHERE job = djob;
  343. Result := res;
  344. RETURN(Result);
  345. EXCEPTION
  346. WHEN OTHERS THEN
  347. Result := 0;
  348. END fnjob;
  349. /
  350. SELECT deptno,ename,sal,fnjob(job),
  351.         SUM(sal) over (ORDER BY job,sal rows BETWEEN CURRENT ROW AND fnjob(job) following) sumsal_dept
  352.         FROM emp
  353.        
  354.  
  355.  
  356. 5) Afisati jobul, numele, salarul curent, salarul anterior si salarul urmator pentru angajati pe
  357. job-uri.
  358.  
  359. SELECT job,ename,sal,
  360.         LAG(sal,1) over (PARTITION BY job ORDER BY sal) lagsal,
  361.         LEAD(sal,1) over (PARTITION BY job ORDER BY sal) leadsal
  362.         FROM emp
  363.        
  364.  
  365. 6) Afisati numarul total de angajati, precum si numarul lor defalcat pe transe de salarii: 0-1000,
  366. 1000-2000, 2000-3000, peste 3000.
  367.  
  368.       SELECT COUNT(e.empno) AS ang_total,
  369.     SUM((CASE WHEN e.sal BETWEEN 0 AND 1000 THEN 1 ELSE 0 END)) AS sal1,
  370.     SUM((CASE WHEN e.sal BETWEEN 1000 AND 2000 THEN 1 ELSE 0 END)) AS sal2,
  371.     SUM((CASE WHEN sal BETWEEN 2000 AND 3000 THEN 1 ELSE 0 END)) AS sal3,
  372.     SUM((CASE WHEN sal>3000 THEN 1 ELSE 0 END)) AS sal4
  373. FROM emp e
  374. ORDER BY sal;
  375.  
  376.  
  377. /*7) Afisati suma vanzarilor (amount_sold) pentru clientii 6380 si 6510 grupat pe trimestrele
  378. anului 1999. De asemenea sa se afiseze si vanzarile cumulate pe trimestre de la inceputul
  379. anului 1999. Informatii de afisat: clientul, trimestrul, suma vanzarilor pe trimestrul curent,
  380. suma cumulata pe trimestrele anterioare. Ordonarea si gruparea se face dupa client si trimestru.*/
  381.  
  382. SELECT cust.cust_last_name,t.calendar_year,t.calendar_quarter_number,SUM(s.amount_sold) Curenta,
  383.    SUM(SUM(s.amount_sold)) over (PARTITION BY cust.cust_last_name ORDER BY t.calendar_quarter_number rows unbounded preceding) suma
  384.      FROM sales s, times t, customers cust
  385.       WHERE s.time_id = t.time_id AND
  386.               s.cust_id = cust.cust_id AND
  387.               cust.cust_id IN (6380,6510) AND
  388.                t.calendar_year = '1999'
  389.                  GROUP BY cust.cust_last_name,t.calendar_year,t.calendar_quarter_number
  390.                  
  391.               /*8) Afisati suma vanzarilor pentru clientul 6380 pe anul 1999 pe luni. Informatii de afisat:
  392. clientul, luna si anul, suma vanzarilor pe luna. Sa se adauge media sumei vanzarilor pe luna
  393. curenta si pe anterioarele 2 luni. Ordonarea si gruparea se face dupa client si luna.*/
  394.  
  395. SELECT cust.cust_last_name, t.calendar_month_number, t.calendar_year,SUM(s.amount_sold),
  396.        AVG(SUM(s.amount_sold)) over (ORDER BY t.calendar_month_number rows BETWEEN  2 preceding AND CURRENT ROW ) bla
  397.         FROM times t,customers cust,sales s
  398.         WHERE s.time_id = t.time_id AND
  399.               s.cust_id = cust.cust_id AND
  400.               cust.cust_id = 6380 AND
  401.               t.calendar_year = '1999'
  402.               GROUP BY  cust.cust_last_name, t.calendar_month_number, t.calendar_year
  403.              
  404.              
  405.         9) Afisati suma vanzarilor (amount_sold) pe zile pentru clientii 6380 si 6510, pentru anul 1999
  406. si saptamana 51. Adaugati media sumei vanzarilor pe o fereastra de 3 zile (una inainte si una
  407. dupa ziua curenta). Ordonarea si gruparea se face dupa client si zi (time_id).
  408.  
  409. SELECT cust.cust_last_name,t.day_number_in_week, t.calendar_year,SUM(s.amount_sold) AS Suma,
  410.   AVG(SUM(s.amount_sold)) over (PARTITION BY cust.cust_last_name
  411.           ORDER BY t.day_number_in_week rows BETWEEN 1 preceding  AND 1 FOLLOWING) AvgSuma
  412.      FROM sales s, times t, customers cust
  413.       WHERE s.time_id = t.time_id AND
  414.               s.cust_id = cust.cust_id AND
  415.               cust.cust_id IN (6380,6510) AND
  416.                t.calendar_year = '1999' AND
  417.                t.fiscal_week_number = 51
  418.                  GROUP BY cust.cust_last_name,t.day_number_in_week, t.calendar_year
  419.  
  420.  
  421. 10) Afisati suma vanzarilor pe zile intre 10 si 15 octombrie 2000. Adaugati doua coloane, una
  422. care sa afiseze suma vanzarilor pentru linia anterioara si una cu suma vanzarilor pentru linia
  423. urmatoare
  424.  
  425.  
  426.  
  427. SELECT t.day_number_in_month,SUM(s.amount_sold) AS Suma,
  428.  -- sum(sum(s.amount_sold)) over (partition by cust.cust_last_name order by t.day_number_in_week rows BETWEEN 1 preceding  and 1 FOLLOWING) AvgSuma
  429.    LAG(SUM(s.amount_sold),1) over (ORDER BY t.day_number_in_month) SumLag,
  430.    LEAD(SUM(s.amount_sold),1) over (ORDER BY t.day_number_in_month) SumLead
  431.      FROM sales s, times t, customers cust
  432.       WHERE s.time_id = t.time_id AND
  433.               s.cust_id = cust.cust_id AND
  434.                t.calendar_year = '2000' AND
  435.                t.calendar_month_number = 10 AND
  436.                t.day_number_in_month BETWEEN 10 AND 15
  437.                  GROUP BY t.day_number_in_month
  438.  
  439.             LAB 5
  440.  
  441.  
  442. --1) Se dau tabelele PRODUCT, CUSTOMER, ORD, ITEM. Creati o tabela fapta (ôfactö),
  443. --numita ORDITEM care sa contina datele din tabelele ORD si ITEM si care sa aiba coloanele:
  444. --custid, prodid, orderdate, commplan, shipdate, qty, actualprice si itemtot.
  445.  
  446. --create materialized view log on ord with rowid;
  447. --/
  448. --create materialized view log on item with rowid;
  449. --/
  450. DROP MATERIALIZED VIEW orditem_view
  451. /
  452. DROP MATERIALIZED VIEW orditem_view1
  453. /
  454. CREATE materialized VIEW orditem_view
  455. build IMMEDIATE
  456. AS
  457. SELECT o.custid,o.orderdate,o.commplan,o.shipdate,
  458.          i.prodid,i.qty,i.actualprice,i.itemtot
  459.           FROM ord o, item i
  460.             WHERE o.ordid = i.ordid;
  461. /
  462.  
  463.  
  464. --2) Pentru tabelele PRODUCT, CUSTOMER si ORDITEM creati view-urile materializate de tip
  465. --log pentru a folosi tipul de sincronizare rapida (äFAST REFRESHö) . Includeti si coloanele
  466. --care trebuie logate.
  467.  
  468. DROP MATERIALIZED VIEW customer
  469.  
  470. CREATE materialized VIEW LOG ON customer
  471.             WITH  ROWID (custid,name,city,repid,creditlimit,state,address) including NEW VALUES;
  472.  
  473. CREATE materialized VIEW LOG ON product WITH  ROWID
  474.                       (prodid,descrip)  including NEW VALUES;
  475. CREATE materialized VIEW LOG ON orditem_view WITH ROWID including NEW VALUES;
  476.  
  477.  
  478. /*3) Creati un view materializat de tip join, fara valori agregat, care sa stocheze informatiile din
  479. comenzi precum si denumirile de produse. View-ul se populeaza imediat cu date, poate fi
  480. sincronizat rapid (FAST REFRESH) atunci cand se comite tranzactia. Afisati informatiile din
  481. view-ul materializat. Inserati o comanda noua si verificati informatiile din view-ul materializat.*/
  482.  
  483. CREATE materialized VIEW fara_valori_agregat
  484. build IMMEDIATE
  485. refresh force ON COMMIT
  486. AS
  487.  SELECT o.custid,o.orderdate,o.commplan,o.shipdate,o.prodid,o.qty,o.actualprice,o.itemtot,
  488.         p.descrip
  489.           FROM product p,orditem_view o
  490.            WHERE p.prodid = o.prodid;
  491.  /          
  492. CREATE materialized VIEW LOG ON  fara_valori_agregat
  493.          WITH ROWID including NEW VALUES
  494.            
  495.        
  496.  
  497. --4) In mod analog create un view materializat de tip join pentru afisarea datelor din comenzi
  498. --precum si informatiile din clienti: nume, oras, stat, limita de credit.
  499.  
  500. CREATE materialized VIEW ord_customer
  501. build IMMEDIATE
  502. refresh force ON COMMIT
  503. AS
  504. SELECT o.ordid,o.orderdate,o.commplan,o.custid,o.shipdate,o.total,
  505.       c.name,c.city,c.state,c.creditlimit
  506.         FROM ord o,customer c
  507.           WHERE c.custid = o.custid;
  508.  
  509.  
  510. /*5) Creati un view materializat care sa stocheze totalul vanzarilor si cantitatile totale pe produse,
  511. view bazat pe cel creat anterior, de tip join. View-ul se populeaza imediat cu date, poate fi
  512. sincronizat rapid (FAST REFRESH) atunci cand se comite tranzactia. Afisati informatiile din
  513. view-ul materializat. Inserati o comanda noua si verificati informatiile din view-ul materializat.
  514. */
  515.  
  516. CREATE materialized VIEW total_vinzari
  517. build IMMEDIATE
  518. refresh force ON COMMIT
  519. AS
  520. SELECT s.prod_id,
  521.        SUM(s.amount_sold) AS Total_Vanzari,
  522.        SUM(o.qty) AS Total_Produse
  523.          FROM orditem_view o,sales s
  524.            WHERE s.cust_id = o.custid
  525.              GROUP BY prod_id
  526.              
  527.              
  528.  
  529.  
  530. 6) Creati acelasi tip de VIEW materializat pentru totalul vanzarilor pe clienti. View-ul sa poate
  531. aplica sincronizarea rapida daca este posibil sau sincronizarea completa IN caz contrar.
  532. Executati aceleasi operatii.
  533.  
  534. CREATE materialized VIEW total_vinzari_pe_clienti
  535. build IMMEDIATE
  536. refresh force ON COMMIT
  537. AS
  538. SELECT custid,
  539.        SUM(itemtot) AS Total_Vanzari,
  540.        SUM(qty) AS Total_Produse
  541.          FROM orditem_view
  542.              GROUP BY custid
  543.              
  544. /*7). Creati un view materializat pre-inregistrat care sa stocheze suma vanzarilor si a cantitatilor
  545. pe luni calendaristice.
  546. // pag 12 din lab 5
  547. */
  548. CREATE TABLE pre_inregistrat
  549. AS
  550. SELECT t.calendar_month_number,
  551.      SUM(s.amount_sold) AS Total_Vanzari,
  552.        SUM(s.quantity_sold) AS Total_Cantitati
  553.          FROM sales s,times t
  554.            WHERE s.time_id = t.time_id
  555.              GROUP BY calendar_month_number
  556.  /            
  557.  CREATE materialized VIEW pre_inregistrat
  558.   ON prebuilt TABLE without reduced precision
  559.   AS
  560. SELECT t.calendar_month_number,
  561.      SUM(s.amount_sold) AS Total_Vanzari,
  562.        SUM(s.quantity_sold) AS Total_Cantitati
  563.          FROM sales s,times t
  564.            WHERE s.time_id = t.time_id
  565.              GROUP BY calendar_month_number
  566.  
  567.              
  568.                 8) Modificati view-urile CREATE anterior cu diversi parametri. Stergeti view-uirile CREATE.
  569.  
  570. ALTER MATERIALIZED VIEW sum_sales_tab
  571. REFRESH FAST;
  572.  
  573. ALTER MATERIALIZED VIEW sum_sales_tab
  574. REFRESH NEXT SYSDATE+7;
  575.  
  576. ALTER MATERIALIZED VIEW sum_sales_tab COMPILE;
  577.  
  578. DROP MATERIALIZED VIEW orditem_view;
  579.  
  580. LAB 6
  581.  
  582.     P1 /*Testati exemplele din cadrul laboratorului.*/
  583. --CREATE INDEX idxemp_ename ON emp(ename);
  584. --CREATE UNIQUE INDEX idxemp_ename_unique ON emp(ename);
  585. --SELECT * FROM emp WHERE ename = 'MARTIN';
  586. --CREATE INDEX idxemp_deptno ON emp(deptno);
  587. --SELECT * from emp e, dept d WHERE e.deptno = d.deptno;
  588. --CREATE INDEX idxemp_hiredate ON emp(hiredate);
  589. /*SELECT * from emp WHERE hiredate
  590. BETWEEN to_date('20/02/1981','DD/MM/YYYY') AND
  591. to_date('20/02/1982','DD/MM/YYYY');*/
  592. --CREATE INDEX idxemp_salcomm ON emp(sal,comm);
  593. --SELECT * from emp WHERE sal < 1500 and comm IS NOT NULL;
  594. --CREATE INDEX idxemp_upperemp ON emp(UPPER(ename));
  595. --SELECT * from emp WHERE UPPER(ename) like '%LL%';
  596. /*CREATE BITMAP INDEX custidx_gender ON customers (cust_gender);
  597. CREATE BITMAP INDEX custidx_marital ON customers
  598. (cust_marital_status);
  599. CREATE BITMAP INDEX custidx_income ON customers (cust_income_level);*/
  600. /*SELECT COUNT(*) FROM customers
  601. WHERE cust_marital_status = 'married'
  602. AND cust_income_level IN ('H: 150,000 - 169,999',
  603. 'G: 130,000 - 149,999');*/
  604. --DROP INDEX idxemp_deptno;
  605. /*SELECT * FROM USER_INDEXES idx, USER_IND_COLUMNS idxc
  606. WHERE idx.index_name = idxc.index_name;*/
  607. /*EXPLAIN PLAN FOR
  608. SELECT e.empno, e.ename, e.job, e.sal, d.dname, d.loc
  609. FROM emp e, dept d
  610. WHERE e.deptno = d.deptno and e.sal < 2200;
  611. select plan_table_output from
  612. table(dbms_xplan.display('plan_table',null,'serial'));*/
  613.  
  614. P2 /*Se dau tabelele PRODUCT, CUSTOMER, ORD, ITEM. Creati urmatorii indexi:
  615. - pentru tabela CUSTOMER:
  616. - creati indexii unici pentru coloana NAME;
  617. - creati indexi simpli, normali pentru CREDITLIMIT si REPID;
  618. - creati un index pe baza de functie care sa optimizeze accesul dupa numele clientului
  619. atunci cand valorile se introduc cu litere mici;
  620. - pentru tabela ORD creati indexii necesari pentru interogarile care implica un join cu tabela de
  621. clienti si care filtreaza liniile dupa data comenzii;*/
  622.  
  623. --create unique index customer_name_index on customer(name);
  624. --create index customer_creditmilit_index on customer(creditlimit);
  625. --create index customer_repid_index on customer(repid);
  626. --CREATE INDEX idx_customer_name ON customer(lower(name));
  627. --p5
  628. --create index ord_join on ord(custid);
  629.  
  630.     P3 /*Afisati produsele comandate in lunile de vara ale anului 1986.
  631. Se vor afisa informatiile din comanda, numele clientului,
  632. orasul, statul si limita de credit, numele agentului si numele
  633. departamentului din care face parte,
  634. precum si liniile de detaliu (numele produsului, cantitate,
  635. pretul si valoarea). Creati indexii necesari si afisati-i din dictionarul de date.
  636. Executati interogarea si afisati planul de executie al interogarii.
  637. Analizati acest plan.*/
  638.  
  639. --create index idx_ord_cust on ord(custid);
  640. --create index idx_cust_emp on customer(repid);
  641. --create index idx_emp_dept on emp(deptno);
  642. --create index idx_ord_item on item(ordid);
  643. --create bitmap index idx_bitmap_ord on ord(orderdate);
  644. explain plan FOR
  645. SELECT o.ordid, o.orderdate,c.name,c.city,c.state,c.creditlimit,
  646. e.ename,d.dname,i.prodid,i.qty, i.actualprice,i.itemtot
  647. FROM ord o, customer c, emp e, dept d, item i WHERE
  648.       o.custid= c.custid AND
  649.       c.repid= e.empno AND
  650.       e.deptno=d.deptno AND
  651.       o.ordid= i.ordid AND
  652.       o.orderdate BETWEEN '31-MAY-86' AND '31-AUG-87';
  653. SELECT plan_table_output FROM
  654. TABLE(DBMS_XPLAN.display('plan_table',NULL,'serial'));
  655.  
  656.     P4 /*La interogarea anterioara filtrati liniile de comanda
  657. care au valoare mai mare decat 400, unde valoarea se calculeaza ca
  658. produs intre cantitate si pret. Creati un index corespunzator pentru
  659. optimizarea accesului. Afisati si analizati planul de executie al interogarii.*/
  660.  
  661. --create bitmap index idx_bitmap_itemtot on item(itemtot);
  662. explain plan FOR
  663. SELECT o.ordid, o.orderdate,c.name,c.city,c.state,c.creditlimit,
  664. e.ename,d.dname,i.prodid,i.qty, i.actualprice,i.itemtot
  665. FROM ord o, customer c, emp e, dept d, item i WHERE
  666.       o.custid= c.custid AND
  667.       c.repid= e.empno AND
  668.       e.deptno=d.deptno AND
  669.       o.ordid= i.ordid AND
  670.       o.orderdate BETWEEN '31-MAY-86' AND '31-AUG-87' AND
  671.       i.itemtot>400;
  672. SELECT plan_table_output FROM
  673. TABLE(DBMS_XPLAN.display('plan_table',NULL,'serial'));
  674.  
  675.     P5 /*Pe baza tabelelor PRODUCT, CUSTOMER, ORD, ITEM, creati o tabela fapta (“fact”),
  676. numita ORDITEM care sa contina datele din tabelele ORD si ITEM si care sa aiba coloanele:
  677. custid, prodid, orderdate, commplan, shipdate, qty, actualprice si itemtot.
  678. Creati indexi
  679. necesari:
  680. - unic compus pentru client, produs;
  681. - creati un index de tip bitmap pentru coloanele candidate;
  682. - lansati o serie de interogari care sa utilizeze indexii creati;
  683. - afisati si analizati planurile de executie a interogarilor.*/
  684.  
  685. /*create table orditem2 as
  686. select o.custid, i.prodid, o.orderdate, o.commplan, o.shipdate,
  687. i.qty,i.actualprice, i.itemtot
  688. from ord o, item i
  689. where o.ordid=i.ordid;*/
  690. --create index idx_comp_client_prod on orditem2(custid, prodid);
  691. --create bitmap index idx_bitm_orditem2 on orditem2(commplan);
  692. /*Exemplu:
  693. EXPLAIN PLAN FOR
  694. SELECT e.empno, e.ename, e.job, e.sal, d.dname, d.loc
  695. FROM emp e, dept d
  696. WHERE e.deptno = d.deptno and e.sal < 2200;
  697. select plan_table_output from
  698. table(dbms_xplan.display('plan_table',null,'serial'));*/
  699.  
  700.         LAB 7
  701. CREATE TABLE sales_22nov_ext
  702. ( PROD_ID CHAR(10),
  703. CUST_ID CHAR(10),
  704. QTY CHAR(10),
  705. AMOUNT CHAR(10)
  706. )
  707. ORGANIZATION EXTERNAL
  708. ( TYPE oracle_loader
  709. DEFAULT DIRECTORY dir_temp
  710. ACCESS PARAMETERS
  711. (
  712. RECORDS DELIMITED BY NEWLINE
  713. BADFILE dir_temp:'sales_22nov.bad_xt'
  714. LOGFILE dir_temp:'sales_22nov.log_xt'
  715. FIELDS TERMINATED BY "|"
  716. MISSING FIELD VALUES ARE NULL
  717. ( PROD_ID CHAR(10),
  718. CUST_ID CHAR(10),
  719. QTY CHAR(10),
  720. AMOUNT CHAR(10)
  721. )
  722. )
  723. location
  724. (
  725. 'sales_22nov.log'
  726. )
  727. )REJECT LIMIT UNLIMITED;
  728.  
  729. SELECT * FROM sales_22nov_ext;
  730.  
  731. SET echo off
  732. SET pagesize 0
  733. SPOOL customer_usa.LOG
  734. SELECT DISTINCT t2.cust_id ||'|'|| t2.cust_first_name ||' ' ||
  735. t2.cust_last_name ||'|'|| t2.cust_gender ||'|'||
  736. t2.cust_marital_status ||'|'|| t2.cust_income_level ||'|'||
  737. t2.cust_credit_limit ||'|'||t2.cust_city||'|'||t2.cust_state_province
  738. FROM countries t1, customers t2
  739. WHERE t1.country_id = t2.country_id
  740. AND t1.country_name= 'United States of America';
  741. SPOOL off
  742.  
  743.  
  744. SELECT * FROM SALES WHERE TO_CHAR(TIME_ID,'DD-MON-YY')='22-NOV-98';
  745.  
  746. CREATE TABLE sales_test (
  747. PROD_ID NUMBER(6) NOT NULL,
  748. CUST_ID NUMBER(6) NOT NULL,
  749. TIME VARCHAR2(10) NOT NULL,
  750. QTY NUMBER(3),
  751. AMOUNT NUMBER(10,2)
  752. );
  753.  
  754. SET echo off
  755. SET pagesize 0
  756. SPOOL D:\Temp\sales_22nov.LOG
  757. SELECT DISTINCT t1.prod_id ||'|'|| t1.cust_id ||'|'||
  758. t1.quantity_sold ||'|'||
  759. t1.amount_sold ||'|'
  760. FROM sales t1
  761. WHERE TO_CHAR(t1.time_id,'DD-MON-YY') = '22-NOV-98';
  762. SPOOL off
  763.        
  764. LAB 8
  765.    
  766.     P1 /*Conectati-va la schema DMxx. Extrageti clientii din CUSTOMERS intr-un tabel CUST_EXT dupa urmatoarele criterii:
  767. - clientii din UK;
  768. - se vor extrage urmatoarele coloane:*/
  769.  
  770. DROP TABLE cust_ext;
  771. CREATE TABLE cust_ext AS
  772. (SELECT CUST_ID,
  773.         CUST_GENDER,
  774.         CUST_YEAR_OF_BIRTH,
  775.         CUST_MARITAL_STATUS,
  776.         CUST_CITY,
  777.         CUST_STATE_PROVINCE,
  778.         COUNTRY_ID,
  779.         CUST_INCOME_LEVEL,
  780.         CUST_CREDIT_LIMIT
  781.         FROM customers WHERE
  782.         country_id IN (SELECT country_id FROM countries WHERE country_name='United Kingdom'));
  783.  
  784.     P2 /*Creati tabelul CUST_DM cu urmatoarea structura: CUST_ID GENDER AGE MARITAL_STATUS CITY STATE_PROVINCE COUNTRY_ID INCOME_ID CREDIT_LIMIT
  785. Se populeaza cu datele din CUST_EXT si se respecta urmatoarele reguli:
  786. - toate valorile null se inlocuiesc cu ‘?’ sau cu -1;
  787. - valorile pentru AGE se calculeaza;
  788. INCOME_ID este un ID cu valori intre A si L care refera spre tabelul nou creat INCOME_LEVEL cu structura: INCOME_ID, LIM_INF,LIM_SUP.*/
  789.  
  790. /*create table cust_dm (
  791. CUST_ID number,
  792. GENDER  char(1),
  793. AGE number,
  794. MARITAL_STATUS varchar2(20),
  795. CITY varchar2(30),
  796. STATE_PROVINCE varchar2(40),
  797. COUNTRY_ID number not null,
  798. INCOME_ID varchar2(20),
  799. CREDIT_LIMIT number
  800. );*/
  801. /*create table income_level as(
  802. select income_id,
  803. CASE
  804.   WHEN lim_inf is NULL AND INSTRC(lim_sup, 'Below', 1, 1) > 0 THEN '0,000'
  805.   WHEN lim_inf is NULL AND INSTRC(lim_sup, 'and above', 1, 1) > 0 THEN substr(lim_sup,2,7)
  806.   ELSE TRIM(lim_inf)
  807. END "lim_inf",
  808. CASE
  809.   WHEN lim_inf is NULL AND INSTRC(lim_sup, 'Below', 1, 1) > 0 THEN substr(lim_sup,8,6)
  810.   WHEN lim_inf is NULL AND INSTRC(lim_sup, 'and above', 1, 1) > 0 THEN '999,999'
  811.   ELSE TRIM(lim_inf)
  812. END "lim_sup"
  813. from
  814. (
  815. select income_level as income_id, lim_inf, lim_sup from
  816. (select income_level, substr(limits,1,instr(limits,'-')-1) as lim_inf,
  817. substr(limits,1+instr(limits,'-')) as lim_sup from
  818. (select distinct substr(cust_income_level,1,instr(cust_income_level,':')-1) as income_level,
  819. substr(cust_income_level,1+instr(cust_income_level,':')) as limits from customers order by income_level))
  820. )
  821. );
  822. select * from income_level;*/
  823. /*create table cust_dm(
  824. CUST_ID number,
  825. GENDER  char(1),
  826. AGE number,
  827. MARITAL_STATUS varchar2(20),
  828. CITY varchar2(30),
  829. STATE_PROVINCE varchar2(40),
  830. COUNTRY_ID char(2),
  831. INCOME_ID varchar2(20),
  832. CREDIT_LIMIT number
  833. );*/
  834. --delete cust_dm;
  835. INSERT INTO cust_dm
  836. SELECT c.cust_id,
  837.       c.cust_gender,
  838.       TO_NUMBER(TO_CHAR(SYSDATE,'YYYY'))-c.cust_year_of_birth AS AGE,
  839.       NVL(c.cust_marital_status,'?'),
  840.       c.cust_city,
  841.       c.cust_state_province,
  842.       c.COUNTRY_ID,
  843.       l.income_id,
  844.       c.CUST_CREDIT_LIMIT FROM cust_ext c, income_level l
  845.      WHERE SUBSTR(c.cust_income_level,1,1)= l.income_id ;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement