| | 1 | = НАПРЕДНА ТЕМА / Data Cube = |
| | 2 | |
| | 3 | Овој дел од проектот претставува аналитички дел на базата за автосалон. |
| | 4 | Во кодот се креира посебна шема: |
| | 5 | |
| | 6 | {{{ |
| | 7 | car_dealership_analytics |
| | 8 | }}} |
| | 9 | |
| | 10 | Оваа шема се користи за анализа на продажбите, приходите, попустите, клиентите, возилата, вработените и начините на плаќање. |
| | 11 | |
| | 12 | == Главна идеја == |
| | 13 | |
| | 14 | Во аналитичкиот дел се користи структура со димензионални табели и една главна факт табела. |
| | 15 | |
| | 16 | Главната идеја може да се претстави вака: |
| | 17 | |
| | 18 | {{{ |
| | 19 | DimDate |
| | 20 | DimEmployee |
| | 21 | DimCustomer |
| | 22 | DimVehicle |
| | 23 | DimPaymentType |
| | 24 | DimContractType |
| | 25 | ↓ |
| | 26 | FactSales |
| | 27 | }}} |
| | 28 | |
| | 29 | Димензионалните табели содржат описни податоци, а факт табелата '''FactSales''' ги содржи податоците за продажбите и приходите. |
| | 30 | |
| | 31 | == Димензионални табели == |
| | 32 | |
| | 33 | Во кодот се креираат следните димензионални табели: |
| | 34 | |
| | 35 | * '''DimDate''' |
| | 36 | * '''DimEmployee''' |
| | 37 | * '''DimCustomer''' |
| | 38 | * '''DimVehicle''' |
| | 39 | * '''DimPaymentType''' |
| | 40 | * '''DimContractType''' |
| | 41 | |
| | 42 | '''DimDate''' содржи информации за датумот, како година, квартал, месец, ден, име на ден и дали денот е викенд. |
| | 43 | |
| | 44 | '''DimEmployee''' содржи податоци за вработените, како employee id, име на вработен и позиција. |
| | 45 | |
| | 46 | '''DimCustomer''' содржи податоци за клиентите, како customer id, име, email, телефон, град и држава. |
| | 47 | |
| | 48 | '''DimVehicle''' содржи податоци за возилата, како VIN, бренд, модел, година, тип на возило, боја, година на производство и основна цена. |
| | 49 | |
| | 50 | '''DimPaymentType''' ги содржи различните типови на плаќање. |
| | 51 | |
| | 52 | '''DimContractType''' ги содржи различните типови на договори. |
| | 53 | |
| | 54 | == FactSales == |
| | 55 | |
| | 56 | Главна табела во аналитичкиот дел е '''FactSales'''. |
| | 57 | |
| | 58 | Оваа табела ги поврзува сите димензии и ги чува главните мерки за продажбата. |
| | 59 | |
| | 60 | Во '''FactSales''' се чуваат: |
| | 61 | |
| | 62 | * sale_id |
| | 63 | * payment_id |
| | 64 | * date_key |
| | 65 | * employee_key |
| | 66 | * customer_key |
| | 67 | * vehicle_key |
| | 68 | * payment_type_key |
| | 69 | * contract_type_key |
| | 70 | * gross_revenue |
| | 71 | * discount_percentage |
| | 72 | * discount_amount |
| | 73 | * net_revenue |
| | 74 | * sale_count |
| | 75 | |
| | 76 | Табелата '''FactSales''' користи foreign key врски кон сите димензионални табели. |
| | 77 | |
| | 78 | Најважните мерки во оваа табела се: |
| | 79 | |
| | 80 | {{{ |
| | 81 | gross_revenue → приход пред попуст |
| | 82 | discount_amount → износ на попуст |
| | 83 | net_revenue → приход после попуст |
| | 84 | sale_count → број на продажби |
| | 85 | }}} |
| | 86 | |
| | 87 | == Индекси == |
| | 88 | |
| | 89 | Во аналитичкиот дел се креираат индекси за побрзо извршување на аналитичките прашалници. |
| | 90 | |
| | 91 | Индекси се креираат на '''FactSales''' според: |
| | 92 | |
| | 93 | * employee_key |
| | 94 | * customer_key |
| | 95 | * vehicle_key |
| | 96 | * payment_type_key |
| | 97 | * contract_type_key |
| | 98 | * date_key + vehicle_key |
| | 99 | * date_key + contract_type_key |
| | 100 | |
| | 101 | Исто така се креираат индекси и на димензионалните табели: |
| | 102 | |
| | 103 | * DimDate(year, month) |
| | 104 | * DimVehicle(brand, model) |
| | 105 | * DimCustomer(city) |
| | 106 | |
| | 107 | Овие индекси се користат за побрзо филтрирање, групирање и пребарување во аналитичките прашалници. |
| | 108 | |
| | 109 | == Обични аналитички views == |
| | 110 | |
| | 111 | Во кодот се креираат неколку аналитички views: |
| | 112 | |
| | 113 | * '''RevenueByBrandAndYear''' |
| | 114 | * '''RevenueByEmployeeAndMonth''' |
| | 115 | * '''SalesByPaymentType''' |
| | 116 | * '''RevenueByCustomerCity''' |
| | 117 | * '''RevenueByVehicleType''' |
| | 118 | * '''RevenueByContractType''' |
| | 119 | |
| | 120 | Овие views служат за анализа на приходите од различни аспекти. |
| | 121 | |
| | 122 | '''RevenueByBrandAndYear''' покажува приходи по бренд и година. |
| | 123 | |
| | 124 | '''RevenueByEmployeeAndMonth''' покажува приходи по вработен и месец. |
| | 125 | |
| | 126 | '''SalesByPaymentType''' покажува продажби и приходи според тип на плаќање. |
| | 127 | |
| | 128 | '''RevenueByCustomerCity''' покажува приходи според град на клиентот. |
| | 129 | |
| | 130 | '''RevenueByVehicleType''' покажува приходи според тип на возило. |
| | 131 | |
| | 132 | '''RevenueByContractType''' покажува приходи според тип на договор. |
| | 133 | |
| | 134 | == Data Cube views == |
| | 135 | |
| | 136 | Во кодот има и materialized views кои користат Data Cube логика. |
| | 137 | |
| | 138 | Главниот cube view е: |
| | 139 | |
| | 140 | {{{ |
| | 141 | SalesCubeBrandYearPaymentContract |
| | 142 | }}} |
| | 143 | |
| | 144 | Овој view користи: |
| | 145 | |
| | 146 | {{{ |
| | 147 | GROUP BY CUBE (dv.brand, dd.year, dpt.payment_type, dct.contract_type) |
| | 148 | }}} |
| | 149 | |
| | 150 | Со ова се добива анализа на продажби и приходи според: |
| | 151 | |
| | 152 | * бренд |
| | 153 | * година |
| | 154 | * тип на плаќање |
| | 155 | * тип на договор |
| | 156 | |
| | 157 | Исто така се добиваат и вкупни вредности, на пример: |
| | 158 | |
| | 159 | * сите брендови |
| | 160 | * сите години |
| | 161 | * сите типови на плаќање |
| | 162 | * сите типови на договори |
| | 163 | |
| | 164 | Во кодот се користи и функцијата '''GROUPING''' за да се означи дали редот е вкупен ред или ред за конкретна вредност. |
| | 165 | |
| | 166 | == SalesCubeBrandYearPayment == |
| | 167 | |
| | 168 | '''SalesCubeBrandYearPayment''' е view кој се базира на '''SalesCubeBrandYearPaymentContract'''. |
| | 169 | |
| | 170 | Овој view ги прикажува податоците според: |
| | 171 | |
| | 172 | * бренд |
| | 173 | * година |
| | 174 | * тип на плаќање |
| | 175 | |
| | 176 | Притоа се земаат редовите каде што типот на договор е вкупен, односно: |
| | 177 | |
| | 178 | {{{ |
| | 179 | is_contract_type_total = 1 |
| | 180 | }}} |
| | 181 | |
| | 182 | == EmployeeSalesRollup == |
| | 183 | |
| | 184 | '''EmployeeSalesRollup''' е materialized view кој прави анализа на продажбите според вработени. |
| | 185 | |
| | 186 | Во него се анализираат: |
| | 187 | |
| | 188 | * позиција |
| | 189 | * employee_id |
| | 190 | * име на вработен |
| | 191 | * година |
| | 192 | * вкупен приход |
| | 193 | * попуст |
| | 194 | * нето приход |
| | 195 | * број на продажби |
| | 196 | * просечна вредност на продажба |
| | 197 | |
| | 198 | Овој view користи: |
| | 199 | |
| | 200 | {{{ |
| | 201 | GROUP BY GROUPING SETS |
| | 202 | }}} |
| | 203 | |
| | 204 | Со тоа се добиваат различни нивоа на групирање, на пример по конкретен вработен, по позиција, по година и вкупно. |
| | 205 | |
| | 206 | == EmployeeCubePositionEmployeeYear == |
| | 207 | |
| | 208 | '''EmployeeCubePositionEmployeeYear''' е view кој ги зема податоците од '''EmployeeSalesRollup'''. |
| | 209 | |
| | 210 | Овој view служи за полесно прикажување на податоците од rollup анализата за вработените. |
| | 211 | |
| | 212 | == VehicleCubeTypeBrandYear == |
| | 213 | |
| | 214 | '''VehicleCubeTypeBrandYear''' е materialized view кој прави cube анализа според возилата. |
| | 215 | |
| | 216 | Овој view користи: |
| | 217 | |
| | 218 | {{{ |
| | 219 | GROUP BY CUBE (dv.vehicle_type, dv.brand, dd.year) |
| | 220 | }}} |
| | 221 | |
| | 222 | Со ова се анализираат приходите според: |
| | 223 | |
| | 224 | * тип на возило |
| | 225 | * бренд |
| | 226 | * година |
| | 227 | |
| | 228 | Исто така се добиваат и вкупни вредности за сите типови на возила, сите брендови и сите години. |
| | 229 | |
| | 230 | == Analyze и проверки == |
| | 231 | |
| | 232 | По креирањето на табелите, views и materialized views, во кодот се извршува '''ANALYZE'''. |
| | 233 | |
| | 234 | Тоа се прави за базата да ги освежи статистиките и подобро да ги извршува прашалниците. |
| | 235 | |
| | 236 | Потоа има и дополнителни проверки: |
| | 237 | |
| | 238 | * проверка на бројот на редови во FactSales |
| | 239 | * проверка дали gross_revenue - discount_amount = net_revenue |
| | 240 | * проверки дали индексите се користат |
| | 241 | * проверки дали резултатите од views се совпаѓаат со рачно пресметани резултати |
| | 242 | |
| | 243 | == Краток заклучок == |
| | 244 | |
| | 245 | Овој дел од проектот претставува аналитички модел за автосалон. |
| | 246 | |
| | 247 | Прво се креира посебна analytics шема. |
| | 248 | Потоа се креираат димензионални табели за датум, вработен, клиент, возило, тип на плаќање и тип на договор. |
| | 249 | Главната факт табела е '''FactSales''', која ги содржи продажбите, приходите, попустите и нето приходот. |
| | 250 | |
| | 251 | Потоа се креираат индекси за побрзи аналитички прашалници, како и повеќе views за анализа на приходите. |
| | 252 | |
| | 253 | Најважниот дел е Data Cube делот, каде што со '''GROUP BY CUBE''' и '''GROUPING SETS''' се добиваат агрегирани резултати на повеќе нивоа, на пример по бренд, година, тип на плаќање, тип на договор, вработен и тип на возило. |