본문 바로가기
카테고리 없음

MYSQL로 구하는 구매지표1 (일별,월별, 연도별 매출액 조회) FEAT. SUBSTR

by 관점부자 2021. 7. 12.

"SQL로 맛보는 테이터 전처리 분석" 책을 바탕으로 어떤 데이터 베이스에서 쓸 수 있게끔 조금 변형을 해보았다.

원래는 ERD(Entity Relational Diagram)라는 것을 파악하면, 이러한 SQL구문을 쓰기가 더 쉽겠지만, 책에서도 어차피 현업에는 없을 경우가 더 많다고 하여서, 최대한 범용적으로 쓸 수있게 써봐야겠다.

 

1) 일별 매출액 조회

일별 매출액을 알기위해 필요한 지표는 "주문일자", "판매액" 인데, 

"판매액"의 경우 좋은 분석을 위해 보통 "제품의 가격""주문 갯수" 가 따로 분리되어서 이 둘을 곱해줄 필요가 있을 것이다. 

즉, 판매액= 제품의  가격 * 주문갯수

 

그래서,

SELECT 주문일자, 판매액

FROM 테이블 이름

LEFT

JOIN  주문일자가 속한 테이블 

ON 각 테이블에서 JOIN으로 묶을 수 있는 공통 영역

 

그래서 쿼리문은 아래와 같다.

SELECT A.ORDERDATE,
PRICEEACH*QUANTITYORDERED AS SALES
FROM CLASSICMODELS.ORDERS A
LEFT
JOIN CLASSICMODELS.ORDERDETAILS B
ON A.ORDERNUMBER = B.ORDERNUMBER
GROUP
BY 1
ORDER
BY 1;

여기서 부터는 SQL구문을 이해하기위해 한글로 풀어써보았다., (영어니까 어순이 바뀌는건가..어쨌든)

 

일단 주문일자를 불러오고 싶어:

CLASSIC MODELS라는 데이터베이스에서(.) ORDERS 테이블을 불러와서 // ORDERDATE를 선택해서 불러와줘 

FROM CLASSICMODELS.ORDERS A //SELECT A.ORDERDATE

 

그리고 상품번호를 기준으로 왼쪽부터 하나 더 정보를 불러와서 조합하고 싶은데 내가 조합하고 싶은건 판매액이야:

판매액은 각 제품의 가격* 주문수량 이므로 (위 책의 ERD 기준으로 작성하면

PRICE EACH * QUANTITY ORDERED 이다.)

 

그래서, 이를 추가한 쿼리는

FROM CLASSICMODELS.ORDERS A //SELECT A.ORDERDATE, PRICEEACH*QUANTITYORDERED(판매액)

LEFT JOIN CLASSICMODELS.ORDERDETAILS B

ON A.ORDERNUMBER = B.ORDERNUMBER

 

 

2) 월별 매출액 구하기

판매일(ORDERDATE)는 기본 형태가 'YYYY-MM-DD'로 구성되어 있어서 SQL에서 따로 함수를 쓸 필요가 없다.

그치만, 월별 매출액을 조회하기 위해서는 'YYYY-MM'의 형태로 가져와 조회할 수 있다. 

이럴 때 문자열에서 원하는 텍스트만 호출하는 함수가 SUBSTR()이다. 이를 통해 우리는 'YYYY-MM'을 추출 할 수 있다.

 

먼저 이 함수의 결과를 보여주면,

SELECT SUBSTR('ABCDE' , 2,3);

입력하면 우리는 'BCD'를 추출 할 수 있다.

즉, 'ABCDE'에서 2번째 문자부터 시작해서 3개의 문자를 가져오라는 명령을 한 것이다.

 

이를 통해 월별 매출을 구하는 방법은 다음과 같다.

SELECT SUBSTR(A.ORDERDATE,1,7) MM
SUM(PRICEEACH*QUANTITYORDERD) AS SALES
FROM CLASSICMODELS.ORDERS A
LEFT
JOIN CLASSIMODELS.ORDERDETALS B
ON A.ORDERNUMBER = B.ORDERNUMBER
GROUP
BY 1
ORDER 
BY 1;

2 0 2 1 - 0 7 - 1 5

1 2 3 4 5 6 7 로 딱 판매일에서 연도,월을 추출 할 수 있다.

 

3) 연도별 매출액 구하기

연도별 매출액은 더 쉽다. 왜냐면 4자리만 추출하면 되니깐요.

SELECT SUBSTR(A.ORDERDATE,1,4) YY
SUM(PRICEEACH*QUANTITYORDERD) AS SALES
FROM CLASSICMODELS.ORDERS A
LEFT
JOIN CLASSIMODELS.ORDERDETALS B
ON A.ORDERNUMBER = B.ORDERNUMBER
GROUP
BY 1
ORDER 
BY 1;

 

 

 

 

P.S 실무에서 가장 기본적인 SQL쿼리문이 될거 같지만, 막상 ERD가없으면 테이블이 속한 값을 찾는것도 초보자에게는 어려울 수 있을 거 같다는 생각이 들었다.

 

그래서 현재 뽑아낸 COLUMN이 어느 TABLE에 속하는지 알려주는 쿼리도 알아두었다.

 

여기서는 WHERE 함수를 공부하면 아마 TABLE에서 원하는 COLUMN 찾기가 무난할 것이다.

 

SELECT
      T.name AS table_nameC.name AS column_name
   FROM
      sys.tables AS T
   INNER JOIN
      sys.columns AS C
   ON
      T.object_id = C.object_id
   WHERE
      C.name = '이름'
 


table_name column_name
출석부 이름
성적 이름

출처: https://m.blog.naver.com/PostView.nhn?isHttpsRedirect=true&blogId=diceworld&logNo=220308637794