wiki:NaprednaTema

Version 3 (modified by 231004, 4 days ago) ( diff )

--

ФАЗА 6 - НАПРЕДНА ТЕМА / Data Cube

КОД

Analitiki.sql

Овој дел од проектот претставува аналитички дел на базата за автосалон. Во кодот се креира посебна шема:

car_dealership_analytics

Оваа шема се користи за анализа на продажбите, приходите, попустите, клиентите, возилата, вработените и начините на плаќање.

Главна идеја

Во аналитичкиот дел се користи структура со димензионални табели и една главна факт табела.

Главната идеја може да се претстави вака:

DimDate
DimEmployee
DimCustomer
DimVehicle
DimPaymentType
DimContractType
        ↓
     FactSales

Димензионалните табели содржат описни податоци, а факт табелата FactSales ги содржи податоците за продажбите и приходите.

Димензионални табели

Во кодот се креираат следните димензионални табели:

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

Исто така се креираат индекси и на димензионалните табели:

Овие индекси се користат за побрзо филтрирање, групирање и пребарување во аналитичките прашалници.

Обични аналитички views

Во кодот се креираат неколку аналитички views:

Овие 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 се добиваат агрегирани резултати на повеќе нивоа, на пример по бренд, година, тип на плаќање, тип на договор, вработен и тип на возило.

Attachments (1)

Download all attachments as: .zip

Note: See TracWiki for help on using the wiki.