UNPIVOT в Oracle SQL: как превратить столбцы в строки

🟢 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)

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


Понравилась статья? Поделиться с друзьями:
0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest
0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии