UNPIVOT в Oracle SQL. Введение
UNPIVOT в Oracle SQL — это оператор, позволяющий преобразовать столбцы в строки. Он используется, когда нужно «развернуть» таблицу с широким форматом (много столбцов) в длинный формат (много строк), что удобно для анализа, агрегаций и визуализации данных.
🖋️ Синтаксис UNPIVOT
SELECT ...
FROM таблица
UNPIVOT (
значение FOR имя_столбца IN (столбец1, столбец2, ...)
);
Пример:
SELECT product_id, quarter, sales
FROM sales_data
UNPIVOT (
sales FOR quarter IN (q1, q2, q3, q4)
);
🔄 Где используется UNPIVOT в Oracle SQL
- Преобразование отчётов для BI-систем
- Подготовка данных для аналитики
- Упрощение агрегирования по периодам
- Нормализация денормализованных таблиц
- Сведение к универсальной структуре «ключ-значение»
📊 Примеры использования UNPIVOT в Oracle SQL (1–50 из 50)
- Преобразование квартальных продаж в строки:
SELECT product_id, quarter, sales
FROM sales_data
UNPIVOT (
sales FOR quarter IN (q1, q2, q3, q4)
);
- UNPIVOT для температуры по времени суток:
SELECT station_id, time_of_day, temperature
FROM temp_table
UNPIVOT (
temperature FOR time_of_day IN (morning, afternoon, evening)
);
- UNPIVOT зарплат по кварталам:
SELECT emp_id, period, salary
FROM payroll
UNPIVOT (
salary FOR period IN (jan, feb, mar)
);
- Разворот KPI показателей:
SELECT department_id, kpi_name, value
FROM kpi_report
UNPIVOT (
value FOR kpi_name IN (efficiency, quality, speed)
);
- Преобразование экзаменационных баллов:
SELECT student_id, subject, score
FROM exam_scores
UNPIVOT (
score FOR subject IN (math, physics, chemistry)
);
- UNPIVOT метрик по источникам трафика:
SELECT page_id, source, visits
FROM traffic_metrics
UNPIVOT (
visits FOR source IN (google, facebook, direct)
);
- UNPIVOT по типам расходов:
SELECT department_id, expense_type, amount
FROM budget_table
UNPIVOT (
amount FOR expense_type IN (travel, training, supplies)
);
- UNPIVOT времени отклика по каналам:
SELECT ticket_id, channel, response_time
FROM support_response
UNPIVOT (
response_time FOR channel IN (email, chat, phone)
);
- UNPIVOT по квартальной прибыли:
SELECT company_id, quarter, profit
FROM profit_data
UNPIVOT (
profit FOR quarter IN (q1, q2, q3, q4)
);
- UNPIVOT температуры по сезонам:
SELECT city, season, temp_avg
FROM climate
UNPIVOT (
temp_avg FOR season IN (winter, spring, summer, autumn)
);
- UNPIVOT показателей здоровья пациента:
SELECT patient_id, metric, value
FROM health_stats
UNPIVOT (
value FOR metric IN (height, weight, blood_pressure)
);
- UNPIVOT активности по дням:
SELECT user_id, day, activity_count
FROM weekly_activity
UNPIVOT (
activity_count FOR day IN (mon, tue, wed, thu, fri)
);
- UNPIVOT затрат на маркетинг:
SELECT campaign_id, channel, spend
FROM marketing_spend
UNPIVOT (
spend FOR channel IN (tv, radio, online)
);
- UNPIVOT оценок по критериям:
SELECT project_id, criterion, rating
FROM evaluations
UNPIVOT (
rating FOR criterion IN (design, usability, innovation)
);
- UNPIVOT продаж по сегментам:
SELECT region, segment, revenue
FROM segmentation
UNPIVOT (
revenue FOR segment IN (retail, enterprise, smb)
);
- UNPIVOT расходов по категориям:
SELECT user_id, category, amount
FROM expense_report
UNPIVOT (
amount FOR category IN (food, travel, utilities)
);
- UNPIVOT запасов по складам:
SELECT product_id, warehouse, quantity
FROM inventory_data
UNPIVOT (
quantity FOR warehouse IN (wh1, wh2, wh3)
);
- UNPIVOT по типу контента:
SELECT post_id, content_type, impressions
FROM social_stats
UNPIVOT (
impressions FOR content_type IN (image, video, text)
);
- UNPIVOT по каналам продаж:
SELECT order_id, channel, value
FROM sales_distribution
UNPIVOT (
value FOR channel IN (in_store, online, wholesale)
);
- UNPIVOT по возрастным группам:
SELECT survey_id, age_group, response
FROM demographics
UNPIVOT (
response FOR age_group IN (under_18, adults, seniors)
);
- UNPIVOT голосов по кандидату:
SELECT precinct_id, candidate, votes
FROM election_results
UNPIVOT (
votes FOR candidate IN (a, b, c)
);
- UNPIVOT расходов на ИТ:
SELECT cost_center, item, total
FROM it_expenses
UNPIVOT (
total FOR item IN (hardware, software, services)
);
- UNPIVOT запасов по категориям:
SELECT location, item_type, stock
FROM warehouse
UNPIVOT (
stock FOR item_type IN (office, tech, furniture)
);
- UNPIVOT оценок по аспектам:
SELECT session_id, aspect, score
FROM user_feedback
UNPIVOT (
score FOR aspect IN (speed, design, support)
);
- UNPIVOT выручки по типам оплаты:
SELECT day, payment_method, total
FROM daily_sales
UNPIVOT (
total FOR payment_method IN (cash, card, digital)
);
- UNPIVOT по типу трафика:
SELECT date_collected, traffic_type, count
FROM web_traffic
UNPIVOT (
count FOR traffic_type IN (organic, referral, paid)
);
- UNPIVOT по часам дня:
SELECT device_id, hour_block, data_used
FROM usage_stats
UNPIVOT (
data_used FOR hour_block IN (h00_06, h06_12, h12_18, h18_24)
);
- UNPIVOT по категориям задач:
SELECT user_id, task_type, duration
FROM task_log
UNPIVOT (
duration FOR task_type IN (coding, testing, meeting)
);
- UNPIVOT расходов на путешествия:
SELECT trip_id, component, cost
FROM travel_expense
UNPIVOT (
cost FOR component IN (flights, hotels, meals)
);
- UNPIVOT вложений по каналам:
SELECT investor_id, channel, amount
FROM investment
UNPIVOT (
amount FOR channel IN (stocks, bonds, crypto)
);
- UNPIVOT откликов по реакциям:
SELECT comment_id, reaction_type, total
FROM reactions
UNPIVOT (
total FOR reaction_type IN (like, love, angry, wow)
);
- UNPIVOT данных опроса:
SELECT respondent_id, question, answer
FROM survey_data
UNPIVOT (
answer FOR question IN (q1, q2, q3)
);
- UNPIVOT по валютным значениям:
SELECT deal_id, currency, value
FROM fx_rates
UNPIVOT (
value FOR currency IN (usd, eur, gbp)
);
- UNPIVOT времени по типу устройства:
SELECT session_id, device_type, duration
FROM session_usage
UNPIVOT (
duration FOR device_type IN (desktop, mobile, tablet)
);
- UNPIVOT логов по уровням:
SELECT log_id, level, count
FROM system_logs
UNPIVOT (
count FOR level IN (info, warning, error)
);
- UNPIVOT продаж по дням недели:
SELECT store_id, day_of_week, amount
FROM weekly_revenue
UNPIVOT (
amount FOR day_of_week IN (mon, tue, wed, thu, fri, sat, sun)
);
- UNPIVOT активности по категориям:
SELECT person_id, activity, duration
FROM fitness_log
UNPIVOT (
duration FOR activity IN (run, swim, bike)
);
- UNPIVOT по устройствам и событиям:
SELECT record_id, event_type, event_count
FROM telemetry
UNPIVOT (
event_count FOR event_type IN (click, scroll, hover)
);
- UNPIVOT расписания по сменам:
SELECT staff_id, shift, hours
FROM staff_schedule
UNPIVOT (
hours FOR shift IN (morning, evening, night)
);
- UNPIVOT по типу клиентов:
SELECT branch_id, client_type, count
FROM client_distribution
UNPIVOT (
count FOR client_type IN (new, returning, vip)
);
- UNPIVOT по сезонам посещений:
SELECT site_id, season, visits
FROM seasonal_traffic
UNPIVOT (
visits FOR season IN (spring, summer, fall, winter)
);
- UNPIVOT по регионам продаж:
SELECT product_id, region, total
FROM product_sales
UNPIVOT (
total FOR region IN (north, south, east, west)
);
- UNPIVOT посещений по каналам:
SELECT campaign_id, channel, hits
FROM campaign_traffic
UNPIVOT (
hits FOR channel IN (seo, ppc, email)
);
- UNPIVOT по вариантам A/B-теста:
SELECT test_id, variant, result
FROM ab_test_results
UNPIVOT (
result FOR variant IN (control, test_a, test_b)
);
- UNPIVOT диагностики по параметрам:
SELECT car_id, parameter, reading
FROM diagnostics
UNPIVOT (
reading FOR parameter IN (oil, coolant, brake)
);
- UNPIVOT по дням недели и типам задач:
SELECT emp_id, weekday, task_count
FROM work_summary
UNPIVOT (
task_count FOR weekday IN (mon, tue, wed, thu, fri)
);
- UNPIVOT по типу прибыли:
SELECT biz_id, source, profit
FROM revenue_streams
UNPIVOT (
profit FOR source IN (product, service, license)
);
- UNPIVOT аналитики по каналам:
SELECT dashboard_id, metric_type, value
FROM dashboard_metrics
UNPIVOT (
value FOR metric_type IN (views, clicks, conversions)
);
- UNPIVOT бюджета по направлениям:
SELECT dept_id, area, spend
FROM annual_budget
UNPIVOT (
spend FOR area IN (hr, ops, dev, marketing)
);
- UNPIVOT использования по приложению:
SELECT user_id, app_name, usage_minutes
FROM app_usage
UNPIVOT (
usage_minutes FOR app_name IN (email, calendar, chat)
);🧩 Заключение
UNPIVOT — мощный инструмент для трансформации данных в аналитически удобную форму. Он позволяет легко “распрямить” таблицу и построить более гибкие отчёты, визуализации и модели.
💡 Запомните:
Работает с именованными столбцами
Идеален для аналитики и BI
Не показывает
NULL-значения по умолчаниюИспользуется с
FOR ... IN (...)
🔜 Следующая статья:
Оператор USING в Oracle SQL — как упростить объединение таблиц с одинаковыми столбцами