| | 1 | # Advanced Reports |
| | 2 | |
| | 3 | ## Најуспешни книги според продажба и приход |
| | 4 | |
| | 5 | ### Data requirements description |
| | 6 | |
| | 7 | Потребно е да се добие аналитички извештај кој ќе прикаже кои книги имаат најголема продажба и најголем остварен приход врз основа на реализираните нарачки. |
| | 8 | |
| | 9 | Извештајот ги користи податоците од книгите, ставките во нарачките и нарачките. За секоја продадена книга се пресметуваат вкупниот број на продадени примероци, вкупниот приход, бројот на реализирани нарачки и просечниот приход од ставките поврзани со книгата. |
| | 10 | |
| | 11 | Овој извештај може да се користи за анализа на успешноста на книгите на подолг временски период и за следење на продажбата и приходите во BiblioPremium. |
| | 12 | |
| | 13 | ### Solution SQL |
| | 14 | |
| | 15 | {{{ |
| | 16 | SELECT |
| | 17 | k.kniga_id, |
| | 18 | k.naslov, |
| | 19 | k.isbn, |
| | 20 | SUM(s.kolicina) AS vkupno_prodadeni, |
| | 21 | SUM(s.kolicina * s.edinechna_cena) AS vkupen_prihod, |
| | 22 | COUNT(DISTINCT n.naracka_id) AS broj_naracki, |
| | 23 | ROUND( |
| | 24 | AVG(s.kolicina * s.edinechna_cena), |
| | 25 | 2 |
| | 26 | ) AS prosechen_prihod_od_stavka |
| | 27 | FROM project.knigi k |
| | 28 | JOIN project.sodrzi s |
| | 29 | ON k.kniga_id = s.kniga_id |
| | 30 | JOIN project.naracki n |
| | 31 | ON s.naracka_id = n.naracka_id |
| | 32 | WHERE n.status = 'ZAVRSENA' |
| | 33 | GROUP BY |
| | 34 | k.kniga_id, |
| | 35 | k.naslov, |
| | 36 | k.isbn |
| | 37 | HAVING SUM(s.kolicina) > 0 |
| | 38 | ORDER BY |
| | 39 | vkupen_prihod DESC; |
| | 40 | }}} |
| | 41 | |
| | 42 | ### Solution Relational Algebra |
| | 43 | |
| | 44 | {{{ |
| | 45 | R1 ← KNIGI ⋈ KNIGI.kniga_id = SODRZI.kniga_id SODRZI |
| | 46 | |
| | 47 | R2 ← R1 ⋈ SODRZI.naracka_id = NARACKI.naracka_id |
| | 48 | σ(status = 'ZAVRSENA')(NARACKI) |
| | 49 | |
| | 50 | R3 ← γ |
| | 51 | kniga_id, naslov, isbn; |
| | 52 | SUM(kolicina) → vkupno_prodadeni, |
| | 53 | SUM(kolicina × edinechna_cena) → vkupen_prihod, |
| | 54 | COUNT(DISTINCT naracka_id) → broj_naracki, |
| | 55 | AVG(kolicina × edinechna_cena) → prosechen_prihod_od_stavka |
| | 56 | (R2) |
| | 57 | |
| | 58 | R4 ← σ(vkupno_prodadeni > 0)(R3) |
| | 59 | |
| | 60 | Резултат ← |
| | 61 | π[ |
| | 62 | kniga_id, |
| | 63 | naslov, |
| | 64 | isbn, |
| | 65 | vkupno_prodadeni, |
| | 66 | vkupen_prihod, |
| | 67 | broj_naracki, |
| | 68 | prosechen_prihod_od_stavka |
| | 69 | ](R4) |
| | 70 | }}} |
| | 71 | |
| | 72 | Во SQL резултатот дополнително се подредува според вкупниот приход во опаѓачки редослед. Ова подредување е за прикажување на резултатот и не е дел од класичната релациска алгебра, бидејќи релациската алгебра не дефинира редослед на редовите. |
| | 73 | |
| | 74 | --- |
| | 75 | |
| | 76 | ## Проценка на ризик од исцрпување на залихата |
| | 77 | |
| | 78 | ### Data requirements description |
| | 79 | |
| | 80 | Потребно е да се добие аналитички извештај кој ќе прикаже кои книги имаат најголем ризик од исцрпување на залихата врз основа на моменталната залиха и досегашната продажба преку реализирани нарачки. |
| | 81 | |
| | 82 | За секоја книга се прикажуваат моменталната залиха, вкупниот број на продадени примероци, бројот на реализирани нарачки, просечната продажба по нарачка и проценетиот број на нарачки до исцрпување на моменталната залиха. |
| | 83 | |
| | 84 | Овој извештај може да се користи за следење на залихите и за навремено идентификување на книгите за кои е потребно дополнување на залихата. |
| | 85 | |
| | 86 | ### Solution SQL |
| | 87 | |
| | 88 | {{{ |
| | 89 | SELECT |
| | 90 | k.kniga_id, |
| | 91 | k.naslov, |
| | 92 | k.kolicina_na_zaliha AS momentalna_zaliha, |
| | 93 | |
| | 94 | SUM(s.kolicina) AS vkupno_prodadeni, |
| | 95 | |
| | 96 | COUNT(DISTINCT n.naracka_id) AS broj_naracki, |
| | 97 | |
| | 98 | ROUND( |
| | 99 | SUM(s.kolicina)::numeric / |
| | 100 | NULLIF(COUNT(DISTINCT n.naracka_id), 0), |
| | 101 | 2 |
| | 102 | ) AS prosecna_prodazba_po_naracka, |
| | 103 | |
| | 104 | ROUND( |
| | 105 | k.kolicina_na_zaliha::numeric / |
| | 106 | NULLIF( |
| | 107 | SUM(s.kolicina)::numeric / |
| | 108 | NULLIF(COUNT(DISTINCT n.naracka_id), 0), |
| | 109 | 0 |
| | 110 | ), |
| | 111 | 2 |
| | 112 | ) AS proceneti_naracki_do_istekuvanje |
| | 113 | |
| | 114 | FROM project.knigi k |
| | 115 | |
| | 116 | JOIN project.sodrzi s |
| | 117 | ON k.kniga_id = s.kniga_id |
| | 118 | |
| | 119 | JOIN project.naracki n |
| | 120 | ON s.naracka_id = n.naracka_id |
| | 121 | AND n.status = 'ZAVRSENA' |
| | 122 | |
| | 123 | GROUP BY |
| | 124 | k.kniga_id, |
| | 125 | k.naslov, |
| | 126 | k.kolicina_na_zaliha |
| | 127 | |
| | 128 | HAVING SUM(s.kolicina) > 0 |
| | 129 | |
| | 130 | ORDER BY |
| | 131 | proceneti_naracki_do_istekuvanje ASC; |
| | 132 | }}} |
| | 133 | |
| | 134 | ### Solution Relational Algebra |
| | 135 | |
| | 136 | {{{ |
| | 137 | R1 ← KNIGI ⋈ KNIGI.kniga_id = SODRZI.kniga_id SODRZI |
| | 138 | |
| | 139 | R2 ← R1 ⋈ SODRZI.naracka_id = NARACKI.naracka_id |
| | 140 | σ(status = 'ZAVRSENA')(NARACKI) |
| | 141 | |
| | 142 | R3 ← γ |
| | 143 | kniga_id, naslov, kolicina_na_zaliha; |
| | 144 | SUM(kolicina) → vkupno_prodadeni, |
| | 145 | COUNT(DISTINCT naracka_id) → broj_naracki |
| | 146 | (R2) |
| | 147 | |
| | 148 | R4 ← σ(vkupno_prodadeni > 0)(R3) |
| | 149 | |
| | 150 | R5 ← |
| | 151 | π[ |
| | 152 | kniga_id, |
| | 153 | naslov, |
| | 154 | kolicina_na_zaliha, |
| | 155 | vkupno_prodadeni, |
| | 156 | broj_naracki, |
| | 157 | ( |
| | 158 | vkupno_prodadeni / broj_naracki |
| | 159 | ) → prosecna_prodazba_po_naracka, |
| | 160 | ( |
| | 161 | kolicina_na_zaliha / |
| | 162 | (vkupno_prodadeni / broj_naracki) |
| | 163 | ) → proceneti_naracki_do_istekuvanje |
| | 164 | ](R4) |
| | 165 | }}} |
| | 166 | |
| | 167 | Во SQL резултатот се подредува според проценетиот број на нарачки до исцрпување на залихата во растечки редослед. На тој начин книгите со помала проценета вредност се прикажуваат први. Подредувањето служи за прикажување на резултатот и не е дел од класичната релациска алгебра. |
| | 168 | |
| | 169 | --- |
| | 170 | |
| | 171 | ## Discussion |
| | 172 | |
| | 173 | Двата аналитички извештаи користат податоци од повеќе релации и овозможуваат анализа на долгорочното работење на BiblioPremium. |
| | 174 | |
| | 175 | Првиот извештај ја анализира успешноста на книгите преку бројот на продадени примероци, бројот на реализирани нарачки и остварениот приход. |
| | 176 | |
| | 177 | Вториот извештај ја анализира состојбата со залихите и овозможува идентификување на книгите кај кои постои поголем ризик од исцрпување на залихата. |
| | 178 | |
| | 179 | И двата извештаи користат само реализирани нарачки со статус ZAVRSENA, со што незавршените нарачки не влијаат врз аналитичките резултати. |
| | 180 | |
| | 181 | Извештаите можат да се користат како основа за периодични аналитички прегледи на продажбата, приходите и залихите во BiblioPremium. |