Advertisement
Guest User

DW-TP1

a guest
Oct 17th, 2018
83
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
SQL 6.09 KB | None | 0 0
  1. -- Question 1
  2. -- The schema used will be the star schema
  3.  
  4. -- Question 2
  5. --2.1
  6. SELECT a.ville, a.age, l.categorie , ex.etat, COUNT(*) AS nb_emprunt
  7. FROM (emprunt e NATURAL JOIN abonne a), (exemplaire ex NATURAL JOIN livre l)
  8. WHERE e.num_ex = ex.numero
  9. GROUP BY(a.ville, a.age, l.categorie, ex.etat);
  10.  
  11. -- We can see that it's correct because the resulting table contains the same number of emprunts that the table emprunts (25)
  12. SELECT COUNT(*)
  13. FROM (emprunt e NATURAL JOIN abonne a), (exemplaire ex NATURAL JOIN livre l)
  14. WHERE e.num_ex = ex.numero;
  15.  
  16. -- 2.2
  17. -- The rollup function calculate subtotals so, for example, how many books in bon etat,
  18. -- how many romans in any etat, how many books empruntes by an age no mattter the genre or etat
  19. -- the categories that are not important for the subtotal are represented by null
  20.  
  21. SELECT a.ville, a.age, l.categorie , ex.etat,COUNT(*) AS nb_emprunt
  22. FROM (emprunt e NATURAL JOIN abonne a), (exemplaire ex NATURAL JOIN livre l)
  23. WHERE e.num_ex = ex.numero
  24. GROUP BY a.ville, rollup(a.age, l.categorie, ex.etat);
  25.  
  26. SELECT a.age, a.ville, l.categorie , ex.etat,COUNT(*) AS nb_emprunt
  27. FROM (emprunt e NATURAL JOIN abonne a), (exemplaire ex NATURAL JOIN livre l)
  28. WHERE e.num_ex = ex.numero
  29. GROUP BY a.age,a.ville , rollup( l.categorie, ex.etat);
  30.  
  31. SELECT a.ville, a.age, l.categorie , ex.etat,COUNT(*) AS nb_emprunt
  32. FROM (emprunt e NATURAL JOIN abonne a), (exemplaire ex NATURAL JOIN livre l)
  33. WHERE e.num_ex = ex.numero
  34. GROUP BY rollup (a.ville, a.age, l.categorie, ex.etat);
  35.  
  36.  
  37. -- 2.3
  38. -- Faz todas as permutaƧoes possiveis
  39. SELECT a.ville, a.age, l.categorie , ex.etat, COUNT(*) AS nb_emprunt
  40. FROM (emprunt e NATURAL JOIN abonne a), (exemplaire ex NATURAL JOIN livre l)
  41. WHERE e.num_ex = ex.numero
  42. GROUP BY a.ville, cube(a.age, l.categorie, ex.etat);
  43.  
  44. SELECT a.ville, a.age, l.categorie , ex.etat, COUNT(*) AS nb_emprunt
  45. FROM (emprunt e NATURAL JOIN abonne a), (exemplaire ex NATURAL JOIN livre l)
  46. WHERE e.num_ex = ex.numero
  47. GROUP BY cube (a.ville, a.age, l.categorie, ex.etat);
  48.  
  49.  
  50. -- Os dois extremos: GROUP BY - te diz algo sobre exatamente um cuboide
  51. --                   GROUP BUY CUBE - Calcula TUDO, todas as permutaƧoes possiveis com as colunas e dados dado
  52. --                                    o que acaba sendo muita coisa e quase impossivel de calcular
  53.  
  54. -- 2.4
  55. -- You have all the granular info and also the subtotals, for each of the parameters specified
  56. SELECT a.ville, a.age, l.categorie , ex.etat, COUNT(*) AS nb_emprunt
  57. FROM (emprunt e NATURAL JOIN abonne a), (exemplaire ex NATURAL JOIN livre l)
  58. WHERE e.num_ex = ex.numero
  59. GROUP BY cube (a.ville, a.age, l.categorie, ex.etat), GROUPING sets(a.ville, a.age);
  60.  
  61. -- 2.5
  62. SELECT COALESCE(a.ville, 'All cities'), COALESCE(to_char(a.age), 'All ages'), COALESCE(l.categorie, 'All categories') AS cat , COALESCE(ex.etat, 'All states'), COUNT(*) AS nb_emprunt
  63. FROM (emprunt e NATURAL JOIN abonne a), (exemplaire ex NATURAL JOIN livre l)
  64. WHERE e.num_ex = ex.numero
  65. GROUP BY cube (a.ville, a.age, l.categorie, ex.etat);
  66.  
  67.  
  68. -- Question 1 (3)
  69. -- The cube's density is height*width*depth?
  70.  
  71. -- Question 2 (4)
  72. -- 2.1
  73. SELECT COALESCE(a.ville, 'All cities'), COALESCE(to_char(a.age), 'All ages'), COALESCE(l.categorie, 'All categories') AS cat ,
  74. COALESCE(ex.etat, 'All states'), COUNT(*) AS nb_emprunt,
  75. dense_rank() OVER (ORDER BY  COUNT(*)) AS rank
  76. FROM (emprunt e NATURAL JOIN abonne a), (exemplaire ex NATURAL JOIN livre l)
  77. WHERE e.num_ex = ex.numero
  78. GROUP BY cube (a.ville, a.age, l.categorie, ex.etat);
  79.  
  80. --2.2
  81. SELECT a.num_ab, a.ville, COUNT(a.num_ab) AS total_abonne,
  82. (SELECT COUNT(a1.ville) FROM emprunt e1 JOIN abonne a1 ON e1.num_ab = a1.num_ab WHERE a1.ville = a.ville) AS total_ville,
  83. ratio_to_report(COUNT(a.num_ab)) OVER (partition BY a.ville) AS ratio
  84. FROM emprunt e JOIN abonne a ON e.num_ab = a.num_ab
  85. GROUP BY (a.num_ab,a.ville);
  86.  
  87. --2.3
  88. SELECT ex.etat, ratio_to_report(COUNT(*)) OVER () AS ratio, COUNT(*) AS emprunts,
  89. SUM(COUNT(*)) OVER (ORDER BY etat ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS total
  90. FROM (emprunt e NATURAL JOIN abonne a), (exemplaire ex NATURAL JOIN livre l)
  91. WHERE e.num_ex = ex.numero
  92. GROUP BY (ex.etat);
  93.  
  94. --2.4
  95. SELECT l.categorie, a.ville, a.age,  ex.etat,
  96. ( SELECT MAX(COUNT(*))
  97.   FROM (emprunt e1 NATURAL JOIN abonne a1), (exemplaire ex1 NATURAL JOIN livre l1)
  98.   WHERE e1.num_ex = ex1.numero AND l1.categorie = l.categorie
  99.   GROUP BY(a1.ville, a1.age, l1.categorie, ex1.etat)
  100. ) AS max_nb_emprunt
  101. FROM (emprunt e NATURAL JOIN abonne a), (exemplaire ex NATURAL JOIN livre l)
  102. WHERE e.num_ex = ex.numero
  103. GROUP BY(a.ville, a.age, l.categorie, ex.etat)
  104. HAVING COUNT(*) =
  105.   (SELECT MAX(COUNT(*))
  106.   FROM (emprunt e1 NATURAL JOIN abonne a1), (exemplaire ex1 NATURAL JOIN livre l1)
  107.   WHERE e1.num_ex = ex1.numero AND l1.categorie = l.categorie
  108.   GROUP BY(a1.ville, a1.age, l1.categorie, ex1.etat))
  109. ORDER BY (l.categorie);
  110.  
  111. -- Question 3 (5)
  112.  
  113. --3.1
  114. SELECT COALESCE(ville, 'All cities'), COALESCE(to_char(age), 'All ages'), COALESCE(categorie, 'All categories') AS cat ,
  115. COALESCE(etat, 'All states'), nb_emprunt
  116. FROM (
  117.   SELECT  ville ,age , categorie, etat,COUNT(*) AS nb_emprunt, dense_rank() OVER (ORDER BY  COUNT(*) DESC) AS r
  118.   FROM (emprunt e NATURAL JOIN abonne a), (exemplaire ex NATURAL JOIN livre l)
  119.   WHERE e.num_ex = ex.numero
  120.   GROUP BY cube (a.ville, a.age, l.categorie, ex.etat))
  121. WHERE r <=2;
  122.  
  123. --3.2
  124. SELECT COALESCE(ville, 'All cities'), COALESCE(to_char(age), 'All ages'), COALESCE(categorie, 'All categories') AS cat ,
  125. COALESCE(etat, 'All states'), nb_emprunt
  126. FROM (
  127.   SELECT  ville ,age , categorie, etat,COUNT(*) AS nb_emprunt, dense_rank() OVER (ORDER BY  COUNT(*)) AS r
  128.   FROM (emprunt e NATURAL JOIN abonne a), (exemplaire ex NATURAL JOIN livre l)
  129.   WHERE e.num_ex = ex.numero
  130.   GROUP BY cube (a.ville, a.age, l.categorie, ex.etat))
  131. WHERE r <=2;
  132.  
  133.  
  134. -- 3.3
  135.  
  136. SELECT  categorie,ville ,age, etat,COUNT(*) AS nb_emprunt, dense_rank() OVER (partition BY l.categorie ORDER BY COUNT(*), categorie) AS r
  137.   FROM (emprunt e NATURAL JOIN abonne a), (exemplaire ex NATURAL JOIN livre l)
  138.   WHERE e.num_ex = ex.numero
  139.   GROUP BY cube (a.ville, a.age, l.categorie, ex.etat);
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement