= НАПРЕДНА ТЕМА / Data Cube = Овој дел од проектот претставува аналитички дел на базата за автосалон. Во кодот се креира посебна шема: {{{ car_dealership_analytics }}} Оваа шема се користи за анализа на продажбите, приходите, попустите, клиентите, возилата, вработените и начините на плаќање. == Главна идеја == Во аналитичкиот дел се користи структура со димензионални табели и една главна факт табела. Главната идеја може да се претстави вака: {{{ DimDate DimEmployee DimCustomer DimVehicle DimPaymentType DimContractType ↓ FactSales }}} Димензионалните табели содржат описни податоци, а факт табелата '''FactSales''' ги содржи податоците за продажбите и приходите. == Димензионални табели == Во кодот се креираат следните димензионални табели: * '''DimDate''' * '''DimEmployee''' * '''DimCustomer''' * '''DimVehicle''' * '''DimPaymentType''' * '''DimContractType''' '''DimDate''' содржи информации за датумот, како година, квартал, месец, ден, име на ден и дали денот е викенд. '''DimEmployee''' содржи податоци за вработените, како employee id, име на вработен и позиција. '''DimCustomer''' содржи податоци за клиентите, како customer id, име, email, телефон, град и држава. '''DimVehicle''' содржи податоци за возилата, како VIN, бренд, модел, година, тип на возило, боја, година на производство и основна цена. '''DimPaymentType''' ги содржи различните типови на плаќање. '''DimContractType''' ги содржи различните типови на договори. == FactSales == Главна табела во аналитичкиот дел е '''FactSales'''. Оваа табела ги поврзува сите димензии и ги чува главните мерки за продажбата. Во '''FactSales''' се чуваат: * sale_id * payment_id * date_key * employee_key * customer_key * vehicle_key * payment_type_key * contract_type_key * gross_revenue * discount_percentage * discount_amount * net_revenue * sale_count Табелата '''FactSales''' користи foreign key врски кон сите димензионални табели. Најважните мерки во оваа табела се: {{{ gross_revenue → приход пред попуст discount_amount → износ на попуст net_revenue → приход после попуст sale_count → број на продажби }}} == Индекси == Во аналитичкиот дел се креираат индекси за побрзо извршување на аналитичките прашалници. Индекси се креираат на '''FactSales''' според: * employee_key * customer_key * vehicle_key * payment_type_key * contract_type_key * date_key + vehicle_key * date_key + contract_type_key Исто така се креираат индекси и на димензионалните табели: * DimDate(year, month) * DimVehicle(brand, model) * DimCustomer(city) Овие индекси се користат за побрзо филтрирање, групирање и пребарување во аналитичките прашалници. == Обични аналитички views == Во кодот се креираат неколку аналитички views: * '''RevenueByBrandAndYear''' * '''RevenueByEmployeeAndMonth''' * '''SalesByPaymentType''' * '''RevenueByCustomerCity''' * '''RevenueByVehicleType''' * '''RevenueByContractType''' Овие views служат за анализа на приходите од различни аспекти. '''RevenueByBrandAndYear''' покажува приходи по бренд и година. '''RevenueByEmployeeAndMonth''' покажува приходи по вработен и месец. '''SalesByPaymentType''' покажува продажби и приходи според тип на плаќање. '''RevenueByCustomerCity''' покажува приходи според град на клиентот. '''RevenueByVehicleType''' покажува приходи според тип на возило. '''RevenueByContractType''' покажува приходи според тип на договор. == Data Cube views == Во кодот има и materialized views кои користат Data Cube логика. Главниот cube view е: {{{ SalesCubeBrandYearPaymentContract }}} Овој view користи: {{{ GROUP BY CUBE (dv.brand, dd.year, dpt.payment_type, dct.contract_type) }}} Со ова се добива анализа на продажби и приходи според: * бренд * година * тип на плаќање * тип на договор Исто така се добиваат и вкупни вредности, на пример: * сите брендови * сите години * сите типови на плаќање * сите типови на договори Во кодот се користи и функцијата '''GROUPING''' за да се означи дали редот е вкупен ред или ред за конкретна вредност. == SalesCubeBrandYearPayment == '''SalesCubeBrandYearPayment''' е view кој се базира на '''SalesCubeBrandYearPaymentContract'''. Овој view ги прикажува податоците според: * бренд * година * тип на плаќање Притоа се земаат редовите каде што типот на договор е вкупен, односно: {{{ is_contract_type_total = 1 }}} == EmployeeSalesRollup == '''EmployeeSalesRollup''' е materialized view кој прави анализа на продажбите според вработени. Во него се анализираат: * позиција * employee_id * име на вработен * година * вкупен приход * попуст * нето приход * број на продажби * просечна вредност на продажба Овој view користи: {{{ GROUP BY GROUPING SETS }}} Со тоа се добиваат различни нивоа на групирање, на пример по конкретен вработен, по позиција, по година и вкупно. == EmployeeCubePositionEmployeeYear == '''EmployeeCubePositionEmployeeYear''' е view кој ги зема податоците од '''EmployeeSalesRollup'''. Овој view служи за полесно прикажување на податоците од rollup анализата за вработените. == VehicleCubeTypeBrandYear == '''VehicleCubeTypeBrandYear''' е materialized view кој прави cube анализа според возилата. Овој view користи: {{{ GROUP BY CUBE (dv.vehicle_type, dv.brand, dd.year) }}} Со ова се анализираат приходите според: * тип на возило * бренд * година Исто така се добиваат и вкупни вредности за сите типови на возила, сите брендови и сите години. == Analyze и проверки == По креирањето на табелите, views и materialized views, во кодот се извршува '''ANALYZE'''. Тоа се прави за базата да ги освежи статистиките и подобро да ги извршува прашалниците. Потоа има и дополнителни проверки: * проверка на бројот на редови во FactSales * проверка дали gross_revenue - discount_amount = net_revenue * проверки дали индексите се користат * проверки дали резултатите од views се совпаѓаат со рачно пресметани резултати == Краток заклучок == Овој дел од проектот претставува аналитички модел за автосалон. Прво се креира посебна analytics шема. Потоа се креираат димензионални табели за датум, вработен, клиент, возило, тип на плаќање и тип на договор. Главната факт табела е '''FactSales''', која ги содржи продажбите, приходите, попустите и нето приходот. Потоа се креираат индекси за побрзи аналитички прашалници, како и повеќе views за анализа на приходите. Најважниот дел е Data Cube делот, каде што со '''GROUP BY CUBE''' и '''GROUPING SETS''' се добиваат агрегирани резултати на повеќе нивоа, на пример по бренд, година, тип на плаќање, тип на договор, вработен и тип на возило.