Skip to content
OrionStats
Retail & e-commerce

Orion Retail

A fictional omnichannel retailer with 8 physical stores and an online store across the Caucasus, Turkey and Europe, 2023–2025. Includes seasonality, campaigns, store openings/closures (for like-for-like analysis), a sales plan, inventory and a deliberately messy customer extract.

Log in to query this database in your browser.

Data dictionary

customers · 4,000 rows

One row per registered customer.

ColumnTypeDescription
customer_idINTEGERPrimary key
first_nameTEXT
last_nameTEXT
emailTEXT
cityTEXT
countryTEXT
segmentTEXTConsumer / Small Business / Corporate
signup_dateTEXT (ISO date)Date the customer registered
birth_yearINTEGERYear of birth (self-reported)
genderTEXT
acquisition_channelTEXTChannel through which the customer was first acquired

products · 108 rows

Product catalogue. Each product exists in Basic/Plus/Pro variants.

ColumnTypeDescription
product_idINTEGERPrimary key
skuTEXT
product_nameTEXT
categoryTEXT
subcategoryTEXTProduct family
unit_costREALPurchase cost per unit (USD)
list_priceREAL2023 shelf price per unit (USD); prices rise ~4% per year
supplierTEXT

stores · 9 rows

Physical stores plus the online channel (store_id 8).

ColumnTypeDescription
store_idINTEGERPrimary key
store_nameTEXT
cityTEXT
regionTEXT
open_dateTEXT (ISO date)Date the store opened
close_dateTEXT (ISO date)Date the store closed (NULL if still open)
size_sqmREALSelling area in square metres (NULL for online)
channelTEXT

orders · 37,651 rows

One row per order (header).

ColumnTypeDescription
order_idINTEGERPrimary key
customer_idINTEGERFK → customers
store_idINTEGERFK → stores
order_dateTEXT (ISO date)
channelTEXT
statusTEXTcompleted / returned / cancelled — only completed orders count as revenue
payment_methodTEXT
discount_pctREALOrder-level discount as a fraction (0.15 = 15%)
campaign_idTEXTFK → campaigns if the order date fell within a campaign (NULL otherwise)

order_items · 75,600 rows

One row per product line within an order.

ColumnTypeDescription
order_item_idINTEGERPrimary key
order_idINTEGERFK → orders
product_idINTEGERFK → products
quantityINTEGERUnits purchased
unit_priceREALPrice per unit before discount (USD)
discount_pctREALDiscount applied to the line (fraction)

campaigns · 12 rows

Marketing campaigns.

ColumnTypeDescription
campaign_idINTEGER
campaign_nameTEXT
channelTEXTemail / social / search / multi
start_dateTEXT (ISO date)
end_dateTEXT (ISO date)
budgetINTEGERTotal campaign spend (USD)

sales_targets · 195 rows

Monthly revenue plan per store for 2024–2025 (Plan vs Fact).

ColumnTypeDescription
store_idINTEGER
year_monthTEXTYYYY-MM
target_revenueREALPlanned net revenue for the month (USD)

inventory_monthly · 3,888 rows

Month-end stock position per product (all locations combined).

ColumnTypeDescription
product_idINTEGER
year_monthTEXT
units_soldINTEGERUnits sold in the month (all statuses)
units_receivedINTEGERUnits received from suppliers
closing_stockINTEGERUnits on hand at month end

calendar · 1,096 rows

Date dimension covering 2023-01-01 to 2025-12-31.

ColumnTypeDescription
dateTEXT (ISO date)Calendar date (primary key)
yearINTEGER
quarterINTEGER
monthTEXT (ISO date)
month_nameTEXT
year_monthTEXT
iso_weekINTEGER
weekdayTEXT
is_weekendINTEGER
is_holidayINTEGER1 if a public holiday in the company calendar

customers_raw · 645 rows

A messy CRM extract used for data-cleaning practice: duplicate rows, missing emails, inconsistent city casing/whitespace and mixed date formats.

ColumnTypeDescription
customer_idINTEGER
first_nameTEXT
last_nameTEXT
emailTEXT
cityTEXT
countryTEXT
segmentTEXT
signup_dateTEXT (ISO date)Mixed formats: YYYY-MM-DD, YYYY/MM/DD, DD.MM.YYYY
birth_yearINTEGER
genderTEXT
acquisition_channelTEXT