| 컬럼 이름 | 데이터 타입 | 설명 |
|---|---|---|
| year | int | 연도(pk) |
| 컬럼 이름 | 데이터 타입 | 설명 |
|---|---|---|
| salesorderid | int | 주문 ID PK |
| unitprice | decimal(19,4) | 제품 단가 |
| orderqty | smallint | 주문 수량 |
| customerid | int | 고객 ID(FK, 고객 테이블과 연결) |
| orderdate | timestamp | 주문 날짜 |
| 컬럼 이름 | 데이터 타입 | 설명 |
|---|---|---|
| customerid | int | 고객 IDPK |
| firstname | VARCHAR(100) | 고객 이름 (성) |
| lastname | VARCHAR(100) | 고객 이름 (이름) |
“2011년 12월”에 첫 주문을 한 고객들의 연도별 매출을 조회하는 SQL 문을 작성하세요.
고객 이름은 이름과 성을 결합하여 생성합니다.
결과는 고객 ID(customerid)기준 오름차순, 연도(year) 기준 오름차순으로 정렬합니다.
customeridcustomer_namecustomer_name = 이름 firstname+ ' ' + 성 lastname yeargmvunitPrice * 주문 수량 orderQty+------------+------------------+--------+----------------+
| customerid | customer_name | year | gmv |
+------------+------------------+--------+----------------+
| 1 | John Doe | 2011 | 2024.12 |
| 1 | John Doe | 2012 | 444.46 |
| 2 | Jane Smith | 2011 | 6036.66 |
+------------+------------------+--------+----------------+
- 첫 주문이 2011년 12월인 고객 아이디를 찾는다.
- 해당 고객들만 필터링
- 고객 아이디와 연도별로 그룹화하여 연도별 매출 계산
SELECT customerid
FROM sales_order
GROUP BY customerid
HAVING SUBSTR(MIN(orderdate), 1, 7) = '2011-12'
WHERE로 필터링하고 그룹화하여 연도별 매출 계산하기SELECT so.customerid,
CONCAT(c.firstname, ' ', c.lastname) AS customer_name,
SUBSTR(so.orderdate, 1, 4) AS year,
SUM(so.unitprice * so.orderqty) AS gmv
FROM sales_order so JOIN customer c ON so.customerid = c.customerid
WHERE so.customerid in (SELECT customerid
FROM sales_order
GROUP BY customerid
HAVING SUBSTR(MIN(orderdate), 1, 7) = '2011-12')
GROUP BY so.customerid, year
ORDER BY so.customerid, year;
2011년 12월에 첫 주문을 한 각 고객의 첫 주문과 마지막 주문 사이의 기간을 기준으로, 해당 기간 동안의 연평균 총거래액(GMV)을 계산합니다. 소수점 2째자리까지 계산해주세요. 결과는 고객 ID(
customerid) 기준으로 오름차순으로 정렬합니다.
0으로 처리하고 계산합니다. 예:customerid)customer_namecustomer_name = 이름 firstname+ ' ' + 성 lastnameavg_yearly_gmv), 소수점 2째자리+------------+------------------+----------------+
| customerid | customer_name | avg_yearly_gmv |
+------------+------------------+----------------+
| 11387 | Megan Ramirez | 2319.6 |
| 11388 | Joseph Martin | 2328.92 |
| 11394 | George McDonald | 2040.49 |
| 11398 | Colin Nath | 2028.51 |
| 11400 | Franklin Raji | 2322.59 |
...
+------------+------------------+----------------+
- 1번에서 만든 테이블을
with cte as를 활용하여 이용하기- 고객 아이디별로 그룹화하여 매출 합계 구하기
max와min을 이용하여 첫 구매연도와 마지막 구매연도의 차를 구해 평균 구하기
WITH cte AS (SELECT so.customerid,
CONCAT(c.firstname, ' ', c.lastname) AS customer_name,
SUBSTR(so.orderdate, 1, 4) AS year,
SUM(so.unitprice * so.orderqty) AS gmv
FROM sales_order so JOIN customer c ON so.customerid = c.customerid
WHERE so.customerid in (SELECT customerid
FROM sales_order
GROUP BY customerid
HAVING SUBSTR(MIN(orderdate), 1, 7) = '2011-12')
GROUP BY so.customerid, year
ORDER BY so.customerid, year)
SELECT customerid, customer_name,
ROUND(SUM(gmv) / (MAX(year) - MIN(year) + 1), 2) AS avg_yearly_gmv
FROM cte
GROUP BY customerid
ORDER BY customerid;
2011년 12월에 첫 주문을 한 고객 대상으로, 고객별 각 연도에서의 주문 수량을 집계하고, 최대 주문 수량과 그 최대 주문 수량을 발생시킨 연도를 찾습니다. 최대 주문 수량이 같은 연도가 있다면, 가장 최근 연도를 출력합니다. 결과는 고객 ID(
customerid) 기준으로 오름차순으로 정렬합니다.
customerid)customer_namecustomer_name = 이름 firstname+ ' ' + 성 lastname max_qty_year)max_total_qty)+------------+------------------+----------------+-----------------+
| customerid | customer_name | max_qty_year | max_total_qty |
+------------+------------------+----------------+-----------------+
| 11387 | Megan Ramirez | 2013 | 5 |
| 11388 | Joseph Martin | 2013 | 6 |
| 11394 | George McDonald | 2013 | 4 |
| 11398 | Colin Nath | 2014 | 2 |
| 11400 | Franklin Raji | 2013 | 7 |
...
+------------+------------------+----------------+-----------------+
- 1, 2번 문제와 같은 방식으로 고객의 연도별 구매 수량 구하기
- window function RANK를 이용하여 구매 수량이 가장 많은 연도와 구매 수량 구하기⭐️
with cte as를 활용하여 위 테이블 이용하기- 고객별 RANK가 1인 행만 출력하기
WITH cte AS (
SELECT so.customerid,
CONCAT(c.firstname, ' ', c.lastname) AS customer_name,
SUBSTR(so.orderdate, 1, 4) AS year,
SUM(orderqty) AS qty
FROM sales_order so JOIN customer c ON so.customerid = c.customerid
WHERE so.customerid IN (
SELECT customerid
FROM sales_order
GROUP BY customerid
HAVING SUBSTR(MIN(orderdate), 1, 7) = '2011-12'
)
GROUP BY so.customerid, year
),
ranked_cte AS (
SELECT customerid,
customer_name,
year,
qty,
RANK() OVER (PARTITION BY customerid ORDER BY qty DESC, year ASC) AS rnk
FROM cte
)
SELECT customerid,
customer_name,
year AS max_qty_year,
qty AS max_total_qty
FROM ranked_cte
WHERE rnk = 1
ORDER BY customerid;