대외활동 및 인턴/빅데이터 분석 학회 BDA
metrics : 연도와 월별 성과 지표 및 직원별 성과 분석 SQL (BDA학회 SQL 문법 기초 연습반)
따`ddah
2024. 11. 13. 20:54
연도와 월별 성과 지표를 계산하고, 직원별 성과 데이터를 분석할 것이다.
📊 1. 연도와 월별 성과 지표 계산 (월간 집계)
먼저, 연도와 월별로 비즈니스 성과를 집계하는 쿼리를 작성한다. 이를 위해 CTE(Common Table Expression)를 활용하여 데이터를 효율적으로 계산 및 구성한다.
쿼리 설명
- MonthlyMetrics CTE:
- 주요 계산 항목:
- 연도, 월
- 총 주문 금액, 주문 수, 고유 고객 수, 총 상품 수, 고유 상품 수, 총 원가
- 이를 통해 연도와 월별로 중요한 성과 지표를 요약한다.
- 주요 계산 항목:
- MonthlyMetricsWithLag CTE:
- 이전 월의 총 주문 금액(LAG 함수 사용)을 추가로 계산한다.
- 이를 기반으로 월간 성장률(전월비)을 계산한다.
- 최종 결과:
- 연도(order_year), 월(order_month)을 기준으로 성과 지표를 확인할 수 있다.
- 월별 성장률(month_over_month_change)로 월간 성과 변화를 쉽게 확인할 수 있다.
주요 코드
WITH MonthlyMetircs AS (
SELECT
YEAR(o.orderdate) AS order_year,
MONTH(o.orderdate) AS order_month,
SUM(od.priceEach * od.quantityOrdered) AS total_order_amount,
COUNT(DISTINCT o.orderNumber) AS total_orders,
COUNT(DISTINCT o.customerNumber) AS unique_customers,
COUNT(od.productCode) AS prd_total,
COUNT(DISTINCT od.productCode) AS prd_dist_total,
SUM(od.quantityOrdered * p.buyPrice) AS total_cost
FROM orders AS o
JOIN orderdetails AS od
ON o.orderNumber = od.orderNumber
JOIN products AS p
ON p.productCode = od.productCode
GROUP BY YEAR(o.orderdate), MONTH(o.orderdate)
),
MonthlyMetricsWithLag AS (
SELECT
*,
LAG(total_order_amount) OVER (ORDER BY order_year, order_month) AS prev_month_order_amount
FROM MonthlyMetircs
)
SELECT
order_year,
order_month,
total_order_amount,
total_orders,
unique_customers,
prd_total,
prd_dist_total,
total_cost,
CASE
WHEN prev_month_order_amount IS NULL THEN NULL
ELSE (total_order_amount - prev_month_order_amount) / prev_month_order_amount
END AS month_over_month_change
FROM MonthlyMetricsWithLag
ORDER BY 1, 2;
🧑💼 2. 직원별 성과 지표 계산
다음으로, 직원별로 비즈니스 성과를 분석하는 SQL 쿼리를 작성한다. 이를 통해 직원들의 기여도를 파악하고, 비즈니스 의사결정에 활용할 수 있다.
쿼리 설명
- EmployeeSales CTE:
- 주요 계산 항목:
- 직원 번호, 이름, 직책
- 총 매출액, 처리한 주문 수, 고유 고객 수
- 직원별 데이터를 그룹화하여 효율적으로 집계한다.
- 주요 계산 항목:
- 최종 결과:
- 직원의 총 매출액(total_sales)을 기준으로 내림차순 정렬하여 성과를 확인한다.
- 주문당 평균 매출(average_sales_per_order), 고객당 평균 매출(average_sales_per_customer)을 추가로 계산한다.
주요 코드
WITH EmployeeSales AS (
SELECT
e.employeeNumber,
e.firstName,
e.lastName,
e.jobTitle,
SUM(od.quantityOrdered * od.priceEach) AS total_sales,
COUNT(DISTINCT o.orderNumber) AS total_orders,
COUNT(DISTINCT c.customerNumber) AS unique_customers
FROM employees AS e
JOIN customers AS c
ON e.employeeNumber = c.salesRepEmployeeNumber
JOIN orders AS o
ON c.customerNumber = o.customerNumber
JOIN orderdetails AS od
ON o.orderNumber = od.orderNumber
GROUP BY e.employeeNumber, e.firstName, e.lastName, e.jobTitle
)
SELECT
employeeNumber,
firstName,
lastName,
jobTitle,
total_sales,
total_orders,
unique_customers,
CASE
WHEN total_orders = 0 THEN NULL
ELSE total_sales / total_orders
END AS average_sales_per_order,
CASE
WHEN unique_customers = 0 THEN NULL
ELSE total_sales / unique_customers
END AS average_sales_per_customer
FROM EmployeeSales
ORDER BY total_sales DESC;
🔍 마무리
위 두 쿼리는 비즈니스 데이터를 효과적으로 분석하고 중요한 지표를 도출하는 데 활용된다. 월간 성과 분석을 통해 시간에 따른 변화와 추세를 확인할 수 있으며, 직원별 성과 분석으로 내부 기여도를 파악할 수 있다.
728x90