SQL

QCC 2회차: DISTINCT | <> | CASE WHEN | DATE()

sawo11 2024. 12. 20. 15:38

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;