1. 이메일 프로모션 캠페인 동의한 고객 수
- Person_Person테이블 사용
- 이메일 프로모션에 동의한 고객
- 해당 고객들 중 개인(소매) 고객의 수
-- 내가 작성한 코드 수정
-- 고객의 수를 구해야 하기 때문에 DISTINCT 해줘야함
-- EmailPromotion = 1 OR 2는 x
SELECT COUNT(DISTINCT BusinessEntityID) customer_count
FROM Person_Person
WHERE (EmailPromotion = 1 OR EmailPromotion = 2) AND PersonType = 'IN';
-- 정답
-- <>0: 0이 아닌
SELECT COUNT(DISTINCT BusinessEntityID) customer_count
FROM Person_Person
WHERE (EmailPromotion <> 0) AND PersonType = 'IN';
2. 2011년 10월 한 달 동안 회사 제품을 주문한 고객 조회 & 구매수량별 고객등급 부여
- Sales_SalesOrderHeader, Sales_SalesOrderDetail, Sales_Customer, Person_Person 테이블 사용
- 주문 날짜가 `2011-10-01` 부터 `2011-10-31` 사이에 해당
- 고객의 총 주문 수량에 따라 5가지 등급으로 분류
-- VIP: 100 개 이상
-- GOLD: 70 개 이상 100 개 미만
-- SILVER: 40 개 이상 70 개 미만
-- BRONZE: 20 개 이상 40 개 미만
-- BASIC: 20 개 미만
SELECT c.customerid as customer_id,
p.firstname as first_name,
p.lastname as last_name,
SUM(so.orderqty) AS total_quantity,
CASE WHEN SUM(so.orderqty) >= 100 THEN 'VIP'
WHEN SUM(so.orderqty) >= 70 THEN 'GOLD' -- CASE WHEN에는 부등호 2개를 한번에 쓸 수 없음
WHEN SUM(so.orderqty) >= 40 THEN 'SILVER'
WHEN SUM(so.orderqty) >= 20 THEN 'BRONZE'
ELSE 'BASIC' END AS customer_class
FROM Sales_Customer c
INNER JOIN Person_Person p ON c.personid = p. businessentityid
INNER JOIN Sales_SalesOrderHeader soh ON c. customerid = soh. customerid
INNER JOIN Sales_SalesOrderDetail so ON soh.salesorderid = so.salesorderid
WHERE soh.orderdate BETWEEN '2011-10-01' AND '2011-10-31' -- 데이터에 시간이 포함되어 있다면 DATE(soh.orderdate)
GROUP BY c. customerid, p. firstname, p. lastname
ORDER BY total_quantity desc;
'SQL' 카테고리의 다른 글
SQL 코드카타 오답: JOIN과 LEFT JOIN의 중요성 | 여러가지 JOIN 조건 부여하기 | 특정 기간동안 대여 가능한 자동차들의 대여비용 구하기 (2) | 2024.12.23 |
---|---|
SQL 코드카타 오답: WITH RECURSIVE() (2) | 2024.12.20 |
SQL 코드카타 오답: 동일한 조건의 대상자가 여러명인 경우 | UNION ALL | NULL값 처리 | 테이블마다 컬럼명의 의미가 다른 경우 (2) | 2024.12.18 |
SQL 코드카타 오답: WHERE에서 두 가지 조건 부여하기 | SUM (2) | 2024.12.17 |
QCC 1회차: WINDOW 함수 | RANK | 상관 서브쿼리 | 2번 JOIN하기 | 우선순위 부여 (1) | 2024.12.13 |