10주차 교육에 대한 회고 (4L)
이번 주부터 SQL 오프라인 강의가 진행되었다.
길다면 길고 짧다면 짧은 한 달간의 태블로 강의가 끝나고 SQL 강의가 시작되어서 나름 기대가 되었다.
SQL을 예전에 공부한 적이 있어서 태블로보다는 낫지 않을까라는 생각을 했지만, 잘못된 판단이었다.
너무나 오랜만에 쿼리를 짜서 그런가 기본도 틀려버리고 머릿속이 하얘지기도 하였다...
또한 태블로 강의를 한 달동안 수강하면서 꽤나 지쳤는지, SQL 강의가 엄청 강도가 높은 것이 아님에도 우리는 많이 힘들어했다.
거기에다 계속 팀 프로젝트가 진행되다보니 진도 따라가랴, 프로젝트 하랴 한 주가 너무나 정신없이 지나갔다!
(체력을 더 길러야 하나...)
태블로도 중요하지만 SQL 역량이 정말 중요하다고 강조를 하셔서 더욱 SQL을 공부하는데에 힘을 쏟아야 할 듯 싶다.주말동안 SQL 복습과 쿼리 테스트도 함께 하면서 실력을 쌓아야겠다.
1. 이번주 수업에서 좋았던 점은? (Liked)
2. 이번주에 새롭게 배운 점은? (Learned)
3. 배운 것에 관해서 내가 부족했던 부분은? (Lacked)
4. 앞으로 뭘 더 하면 좋을까? (Longed for)
1. 이번주 수업에서 좋았던 점은? (Liked)
✔ SQL 강의
SQL에 대해서 오랜만에 공부하게 되었다.강사님께서 차근히 알려주시고 많은 내용을 알려주셔서 많은 도움이 되었다. 직접 쿼리를 짤 수 있도록 과제를 내주셔서 이를 통해서 조금씩 실력이 늘어나가고 있는 듯하다.
2. 이번주에 새롭게 배운 점은? (Learned)
✔ SQL 고급 쿼리, 함수
SQL을 까먹고 지낸지가 꽤 되어서.. 이번 강의를 들으면서 다시 복기를 할 수 있어서 좋았다.
그리고 이전에는 배우지 못한 SQL 고급 함수들, 쿼리들을 배울 수 있어서 이를 잘 활용하다면 데이터를 추출할 때 유용하겠다는 생각이 들었다.
또한 데이터를 처음 접했을 때, 바로 쿼리를 짜려고 하는 것이 아닌 데이터를 어떻게 파악해야 하는지부터 차근히 알려주셔서 정말 좋았다. 데이터를 어떻게 뜯어봐야할지 알게 되었다.
3. 배운 것에 관해서 내가 부족했던 부분은? (Lacked)
✔ 쿼리 짜는 실력..
팀 프로젝트를 하면서 쿼리를 잘못 짜서 데이터의 결과물이 잘못 나온 일이 있어서.. 쿼리 짜는 연습을 계속 해야겠다는 생각이 들었다.
어떤 식으로 쿼리를 짜야 하는지에 대한 고민을 하는 것부터 차근히 진행을 해야겠다.
또한 쿼리 짜는 연습을 하면서 다시 쿼리에 익숙해지도록 노력해야겠다.
4. 앞으로 뭘 더 하면 좋을까? (Longed for)
✔ SQL 쿼리 공부
일주일동안 공부했던 SQL 쿼리를 복습하고 시중에 있는 쿼리 테스트를 꾸준히 풀어보면서 쿼리에 익숙해지도록 할 것이다.
해커톤에서도 SQL 쿼리 짜는 것이 가장 중요하다고 하셔서,, 쿼리 짜는 실력을 더 늘릴 수 있도록 공부해야 할 듯하다!
✔ 최종 평가 공부
다음주 금요일에 또.. 최종평가 시험이 있다..!
지난 번 중간평가에 이어서 문제를 푸는 시험이고, 태블로와 SQL에 대해서 문제가 나온다고 한다.
태블로는 구현하는 것보다는 이론적인 부분이 나오고, SQL은 쿼리를 직접 짜기도 해야 한다고 한다.
그래서 최종 평가 공부도 함께 겸해야 할듯 싶다..!😂😂
10주차 교육 내용 - 23.04.10 ~ 23.04.14
📌 테이블 정의서 제작
데이터를 전달받았을 때, 바로 쿼리를 짜는 것보다는 데이터를 파악한 후에 어떤 식으로 데이터를 추출할지를 고민해봐야 한다.
그렇기 때문에 우선 테이블 정의서를 만들어서 데이터에 대한 특징들을 정리해두는 것이 좋다.
✔ 각 테이블의 컬럼 별로 데이터를 확인하여 데이터에 대한 특징을 정리
→ 각 컬럼 별 설명, 자료형, 자리수, 디폴트값, null 가능 여부, null 갯수, PK 여부, 특이사항
📌 공통테이블 표현식 CTE (Common Table Expression)
- 데이터셋을 생성하기 위한 복잡한 코드와 로직이 필요한 경우
- 동일한 로직이 반복되는 경우
- 복잡한 쿼리문의 결과에 이름을 붙여 임시 테이블로 사용
- 복잡한 쿼리문이 반복 사용될 때 유용
- 코드의 가독성, 재사용성을 높일 수 있다.
- 일회용이므로 재사용하려면 코드를 저장해두어야 한다.
1) 임시 테이블 생성 및 출력
WITH cte_order_details AS (
SELECT o.order_id
, o.customer_id
, o.order_date
, to_char(o.order_date, 'YYYY') AS YEAR
, to_char(o.order_date, 'mm') AS MONTH
, to_char(o.order_date, 'dd') AS DAY
, to_char(o.order_date, 'q') AS quarter
, od.product_id
, od.unit_price
, od.quantity
, od.discount
, od.unit_price * od.quantity * (1-od.discount) AS sales
FROM orders o
INNER JOIN order_details od
ON o.order_id = od.order_id
)
SELECT YEAR
, MONTH
, DAY
, sum(sales) AS 매출액
, count(DISTINCT order_id) AS 주문건수
, count(DISTINCT customer_id) AS 주문자수
, sum(sales) / count(DISTINCT order_id) AS 건당평균주문액
, sum(sales) / count(DISTINCT customer_id) AS 인당평균주문액
FROM cte_order_details
GROUP BY 1, 2, 3;
2) 임시 테이블 2개 만들기
WITH cte_order_details AS (
SELECT o.order_id
, o.customer_id
, o.order_date
, to_char(o.order_date, 'YYYY') AS YEAR
, to_char(o.order_date, 'mm') AS MONTH
, to_char(o.order_date, 'dd') AS DAY
, to_char(o.order_date, 'q') AS quarter
, od.product_id
, od.unit_price
, od.quantity
, od.discount
, od.unit_price * od.quantity * (1-od.discount) AS sales
FROM orders o
INNER JOIN order_details od
ON o.order_id = od.order_id
), cte_order_info AS (
SELECT YEAR
, MONTH
, DAY
, sum(sales) AS 매출액
, count(DISTINCT order_id) AS 주문건수
, count(DISTINCT customer_id) AS 주문자수
, sum(sales) / count(DISTINCT order_id) AS 건당평균주문액
, sum(sales) / count(DISTINCT customer_id) AS 인당평균주문액
FROM cte_order_details
GROUP BY 1, 2, 3
)
SELECT sum(매출액)
, sum(주문건수)
FROM cte_order_info;
→ cte_order_info에서는 year, month, day 별 매출액과 주문건수 등을 구했다면,
최종 select 구문에서 cte_order_info에서 구한 매출액과 주문건수 등을 합산한 전체 매출액, 주문건수 등을 출력할 수 있다.
📌 윈도우 함수 (WINDOW FUNCTIONS)
1) 윈도우 함수 종류
집계 함수 | 집계함수 (count, sum 등) | |
순위함수 | RANK | 중복 순위 존재 시 건너띔 (1, 1, 3, 4, 5, 5, 7...) |
DENSE_RANK | 중복 순위 존재 시 건너 뛰지 않음 (1, 1, 3, 4, 4, 5, ...) | |
ROW_NUMBER | 동일 순위 존재하여도 연속번호 부여 (1, 2, 3, 4, 5, 6, 7,...) | |
행 순서 함수 | FIRST_VALUE | 파티션 별 윈도우에서 가장 먼저 나오는 값 (min) |
LAST_VALUE | 파티션 별 윈도우에서 가장 늦게 나오는 값 (max) | |
LAG | 파티션 별 윈도우에서 이전 행 값 | |
LEAD | 파티션 별 윈도우에서 다음 행 값 | |
그룹 내 비율 함수 | RATIO_TO_REPORT | |
PERCENT_RANK | 백분위 수 | |
CUME_DIST | ||
NTILE | 구간 나누기 |
2) 집계
전체 집계 | 집계함수 OVER() |
그룹 집계 | 집계함수 OVER(PARTITON BY <컬럼이름>) |
프레임 지정 | 집계함수 OVER(윈도우프레임지정) |
3) 집계 함수
✅ 전체 데이터에 대한 sum 계산
→ sum(sales) over() : 전체 데이터에 대한 총계가 출력됨
WITH cte_order_details AS (
SELECT o.order_id
, o.customer_id
, o.order_date
, to_char(o.order_date, 'YYYY') AS YEAR
, to_char(o.order_date, 'mm') AS MONTH
, to_char(o.order_date, 'dd') AS DAY
, to_char(o.order_date, 'q') AS quarter
, od.product_id
, od.unit_price
, od.quantity
, od.discount
, od.unit_price * od.quantity * (1-od.discount) AS sales
FROM orders o
INNER JOIN order_details od
ON o.order_id = od.order_id
)
SELECT YEAR, MONTH, DAY
, sum(sales) over()
FROM cte_order_details;
✅ 순서 지정 누적 합계 (order by)
→ YEAR 단위로 누적 합계 진행
SELECT YEAR, MONTH, DAY
, sum(sales) over(ORDER BY YEAR)
FROM cte_order_details;
✅ 그룹 집계 (partition by + order by)
→ partition by로 설정한 단위 (year)로 누적 합계가 진행됨
→ 다음 year에서는 처음부터 다시 합계가 누적됨
SELECT YEAR, MONTH, DAY
, sum(sales) over(PARTITION BY YEAR ORDER BY YEAR, MONTH)
FROM cte_order_details;
4) 행 순서 함수
✅ LAG (이전 행 출력)
WITH cte_order_details AS (
-- 생략 --)
-- 1) 년, 월 별 매출액 출력
, cte_sales AS (
SELECT YEAR
, MONTH
, sum(sales) AS 총매출액
FROM cte_order_details
GROUP BY 1, 2
ORDER BY 1, 2)
-- 2) 전월 매출액 출력 (LAG 함수 사용)
, cte_pre_sales AS (
SELECT *
, lag(총매출액) over(ORDER BY YEAR, MONTH) AS 전월매출액
FROM cte_sales)
-- 3) 기존 매출액 & 전월 매출액을 기반으로 증감액, 증감 비율 계산
SELECT *
, 총매출액 - 전월매출액 AS 전월대비증감액
, (round((총매출액 / 전월매출액)*100)::varchar(10)||'%') AS 전월대비매출액비율
, (CASE WHEN (총매출액 - 전월매출액) < 0 THEN '-'
WHEN (총매출액 - 전월매출액) > 0 THEN '+'
WHEN (총매출액 - 전월매출액) = 0 THEN '동일'
ELSE '해당없음'
END) AS 증감여부
FROM cte_pre_sales;
✅ LEAD (다음 행 출력)
WITH cte_order_details AS (
-- 생략 --)
, cte_pre_sales AS (
SELECT YEAR
, MONTH
, DAY
, sum(sales) AS 총매출액
FROM cte_order_details
GROUP BY 1, 2, 3
ORDER BY 1, 2, 3
)
SELECT *
, lead(총매출액) over(ORDER BY YEAR, MONTH, DAY) AS 익일매출
FROM cte_pre_sales;
📌 윈도우 프레임 지정
ROWS BETWEEN start AND end
👇 start와 end에 들어갈 프레임
CURRENT ROW | 현재 행 |
n PRECEDING | n행 앞 |
n FOLLOWING | n행 뒤 |
UNBOUNDED PRECEDING | 이전 행 전부 |
UNBOUNDED FOLLOWING | 이후 행 전부 |
✔ 5일 이동평균 구하기
평균을 구하는 쿼리에서 아래의 식을 추가하면 된다.
→ ROWS BETWEEN 4 PRECEDING AND CURRENT ROW
→ 현재 행 기준 이전 4개의 행부터 현재행까지의 평균 값
→ [+] 평균을 내는 행의 갯수가 5개 미만이면 NULL값 출력하기 (CASE WHEN 활용)
WITH cte_order_details AS (
-- 생략 --)
-- 1) 총매출액 계산
, cte_sales AS (
SELECT YEAR, MONTH, DAY
, sum(sales) AS total_sales
FROM cte_order_details
GROUP BY 1, 2, 3
ORDER BY 1, 2, 3)
-- 2) 이동평균 구하기
SELECT *
, CASE WHEN row_number() over(ORDER BY YEAR, MONTH, DAY) >= 5
THEN avg(total_sales) over(ORDER BY YEAR, MONTH, DAY ROWS BETWEEN 4 PRECEDING AND CURRENT ROW)
ELSE NULL
END AS 이동평균
FROM cte_sales;
📌 ABC 분석
- 통계적 방법에 의해 관리대상을 A, B, C 그룹으로 나누고, 먼저 A그룹을 최중점 관리대상으로 선정하여 관리노력을 집중함으로써 관리효과를 높이려는 분석방법
- 고객 분석, 제품 분석을 할 때 사용하게 됨
✅ ABC 분석 순서
① 매출액이 많은 순으로 정렬한다.
② 총매출액을 100%로 하여 백분비를 산출한다.
③ 그 누적 구성비율을 상위의 제품부터 순서대로 누적해 간다.
④ 그래프의 세로에 매출액 점유비의 누적치를, 가로축에 제품을 기입하고 제품 별 누적 구성비를 표시해간다.
⑤ 세로축의 70%와 90%의 누적치 해당점에서 가로선을 긋고, 그래프의 선과의 교차점에서 수직선을 긋는다.
1) 쿼리 짜기
WITH cte_products_sales AS (
-- 생략 --)
-- 1) 제품 별 매출액
, cte_sales AS (
SELECT product_id
, product_name
, sum(sales) 매출액
FROM cte_products_sales
GROUP BY 1, 2
ORDER BY product_id)
-- 2) 제품 별 매출액 비율
, cte_ratio AS (
SELECT *
, sum(매출액) OVER() AS 전체매출액
, 매출액 / sum(매출액) OVER() * 100 AS 구성비
FROM cte_sales)
-- 3) 매출 비율 누계
, cte_ratio_agg AS (
SELECT *
, sum(구성비) OVER(ORDER BY 구성비 DESC) AS 구성비누계
FROM cte_ratio
ORDER BY 구성비 DESC)
-- 4) 등급
SELECT *
, CASE WHEN 구성비누계 <= 70 THEN 'A'
WHEN 구성비누계 <= 90 THEN 'B'
ELSE 'C'
END AS 등급
FROM cte_ratio_agg
ORDER BY 구성비 DESC;
2) 시각화
- A 등급 : 매출의 70%를 차지하는 제품
- B 등급 : 매출의 90%를 차지하는 제품
- C 등급 : 그 외 나머지를 차지하는 제품
→ 먼저 A그룹을 고객관리의 최중점목표로 하여 대책을 강구한 다음, B,C 그룹으로 옮겨 간다.
📌 피벗(PIVOT) 진행
1) 1997년 분기별 판매수량
다음과 같이 분기 별로 판매 수량 TOP 5 제품 리스트를 만들고자 한다.
이는 PIVOT 테이블로 만들면 되며, CASE WHEN 구문을 활용할 수 있다.
rank | 1997-1분기 | 1997-2분기 | 1997-3분기 | 1997-4분기 |
WITH cte_products_sales AS (
-- 생략 --)
-- 1) 총판매수량, 총매출액 계산
, cte_sales_quantity AS (
SELECT YEAR
, quarter
, product_name AS 제품명
, sum(sales) AS 총매출액
, sum(quantity) AS 총판매수량
FROM cte_products_sales
WHERE YEAR = '1997'
GROUP BY 1, 2, 3
ORDER BY 1, 2, 5 DESC)
-- 2) 순위 계산
, cte_rank AS (
SELECT YEAR
, quarter
, rank() OVER(PARTITION BY quarter ORDER BY 총판매수량 DESC,총매출액 DESC) AS RANK
, 총판매수량
, 제품명
FROM cte_sales_quantity
ORDER BY quarter, RANK)
-- 3) 피벗 테이블
SELECT RANK
, max(CASE WHEN quarter = '1' THEN 제품명 END) AS "1997-1분기"
, max(CASE WHEN quarter = '2' THEN 제품명 END) AS "1997-2분기"
, max(CASE WHEN quarter = '3' THEN 제품명 END) AS "1997-3분기"
, max(CASE WHEN quarter = '4' THEN 제품명 END) AS "1997-4분기"
FROM cte_rank
WHERE RANK <= 10
GROUP BY RANK;
2) 1997년 분기별 판매수량 - 순위 변화
순위변화는 WINDOW 함수를 활용하여 구하라고 하셔서, 많은 시도 끝에 LAG 함수를 사용하여 쿼리를 짰다.
① 년도와 분기를 하나의 컬럼으로 묶음 (year_quarter)
② 년도+분기 별로 순위를 계산
③ 년도+분기 별로 순위를 1단계씩 lag한 후, 기존 순위와 lag한 순위의 차이를 구함 (순위변동)④ 기존 순위와 순위변동 컬럼을 각 분기에 맞춰서 피벗 진행 (CASE WHEN 활용)
✔ 쿼리문
WITH cte_products_sales AS (
-- 생략 --)
-- 1) 총판매수량, 총매출액 계산
, cte_sales_quantity AS (
SELECT year_quarter
, product_name AS 제품명
, sum(sales) AS 총매출액
, sum(quantity) AS 총판매수량
FROM cte_products_sales
GROUP BY 1, 2
ORDER BY 1)
-- 2) 순위 계산
, cte_rank AS (
SELECT year_quarter
, 제품명
, rank() OVER(PARTITION BY year_quarter ORDER BY 총판매수량 DESC,총매출액 DESC) AS RANK
FROM cte_sales_quantity)
-- 3) 각 분기 별 순위
, cte_quarter_rank AS (
SELECT *
, lag(RANK, 1) over(PARTITION BY 제품명 ORDER BY year_quarter)
, lag(RANK, 1) over(PARTITION BY 제품명 ORDER BY year_quarter) - RANK AS 순위변동
FROM cte_rank)
-- 4) 피벗 테이블
SELECT RANK
, max(CASE WHEN year_quarter = '1997-1' THEN 제품명 END) AS q9701
, max(CASE WHEN year_quarter = '1997-1' THEN 순위변동 END) AS 순위변동
, max(CASE WHEN year_quarter = '1997-2' THEN 제품명 END) AS q9702
, max(CASE WHEN year_quarter = '1997-2' THEN 순위변동 END) AS 순위변동
, max(CASE WHEN year_quarter = '1997-3' THEN 제품명 END) AS q9703
, max(CASE WHEN year_quarter = '1997-3' THEN 순위변동 END) AS 순위변동
, max(CASE WHEN year_quarter = '1997-4' THEN 제품명 END) AS q9704
, max(CASE WHEN year_quarter = '1997-4' THEN 순위변동 END) AS 순위변동
FROM cte_quarter_rank
WHERE RANK <= 10
GROUP BY 1
ORDER BY 1;
📌 그룹 함수
- GROUPING SETS : 기재된 컬럼 별로 그룹핑한 집계를 모두 출력
- ROLLUP : 기재된 컬럼 별로 소계 및 총계를 출력
- CUBE : 컬럼 조합의 모든 경우의 수에 해당하는 소계를 출력
✅ 고객 속성에 대한 집계를 그룹 함수를 사용하여 계산하기
→ customers, orders, order_details 테이블 사용
→ 고객 회사 별, 고객 국가 별, 고객 도시 별, 고객 회사 직원의 직급 별 총 매출액, 주문건수
1) GROUPING SETS
-- 1) grouping sets
WITH cte_customer_sales_cnt AS (
SELECT c.company_name
, c.contact_title
, c.country
, c.city
, sum(od.unit_price * od.quantity * (1 - od.discount)) AS sales
, count(DISTINCT o.order_id) AS order_cnt
FROM orders o, order_details od, customers c
WHERE o.order_id = od.order_id
AND o.customer_id = c.customer_id
GROUP BY GROUPING SETS (company_name, contact_title, country, (country, city), ())
-- 2) 고객 회사 별 총매출액 & 주문건수
, cte_company_sales_cnt AS (
SELECT company_name
, sales
, order_cnt
FROM cte_customer_sales_cnt
WHERE company_name IS NOT NULL
ORDER BY sales DESC)
-- 3) 고객 회사의 직원 직급 별 총매출액 & 주문건수
, cte_title_sales_cnt AS (
SELECT contact_title
, sales
, order_cnt
FROM cte_customer_sales_cnt
WHERE contact_title IS NOT NULL
ORDER BY sales DESC)
-- 4) 고객 국가 별 총매출액 & 주문건수
, cte_country_sales_cnt AS (
SELECT country
, sales
, order_cnt
FROM cte_customer_sales_cnt
WHERE country IS NOT NULL
ORDER BY sales DESC)
-- 5) 고객 도시 별 총매출액 & 주문건수
, cte_city_sales_cnt AS (
SELECT country
, city
, sales
, order_cnt
FROM cte_customer_sales_cnt
WHERE city IS NOT NULL
ORDER BY sales DESC)
-- 6) 전체 총매출액 & 주문건수
, cte_all_sales_cnt AS (
SELECT 'all' AS ALL
, sales
, order_cnt
FROM cte_customer_sales_cnt
ORDER BY sales DESC
LIMIT 1)
-- 고객 회사 별 : cte_company_sales_cnt
-- 고객 국가 별 : cte_country_sales_cnt
-- 고객 도시 별 : cte_city_sales_cnt
-- 고객 회사의 직원 직급 별 : cte_title_sales_cnt
SELECT *
FROM cte_all_sales_cnt;
2) ROLLUP
WITH cte_customer_sales_cnt AS (
SELECT to_char(o.order_date, 'YYYY') AS YEAR
, to_char(o.order_date, 'mm') AS MONTH
, to_char(o.order_date, 'dd') AS DAY
, to_char(o.order_date, 'q') AS quarter
, c.company_name
, c.contact_title
, c.country
, c.city
, od.unit_price * od.quantity * (1 - od.discount) AS sales
, o.order_id
FROM orders o, order_details od, customers c
WHERE o.order_id = od.order_id
AND o.customer_id = c.customer_id)
-- 2) 고객 회사 별 총매출액 & 주문건수
, cte_customers_sales_cnt_rollup AS (
SELECT company_name
, contact_title
, country
, city
, sum(sales) AS total_sales
, count(DISTINCT order_id) AS order_cnt
FROM cte_customer_sales_cnt
GROUP BY ROLLUP (company_name, contact_title, country, city)
ORDER BY 1, 2, 3, 4)
-- 3) 시기 별 총매출액 & 주문건수
, cte_days_sales_cnt_rollup AS (
SELECT YEAR
, quarter
, MONTH
, DAY
, sum(sales) AS total_sale
, count(DISTINCT order_id) AS order_cnt
FROM cte_customer_sales_cnt
GROUP BY ROLLUP (YEAR, quarter, MONTH, DAY)
ORDER BY 1, 2, 3, 4)
-- 고객 회사 별 : cte_customers_sales_cnt_rollup
-- 시기 별 : cte_days_sales_cnt_rollup
SELECT *
FROM cte_customers_sales_cnt_rollup;
3) CUBE
WITH cte_customer_sales_cnt AS (
SELECT to_char(o.order_date, 'YYYY') AS YEAR
, to_char(o.order_date, 'mm') AS MONTH
, to_char(o.order_date, 'dd') AS DAY
, to_char(o.order_date, 'q') AS quarter
, c.company_name
, c.contact_title
, c.country
, c.city
, od.unit_price * od.quantity * (1 - od.discount) AS sales
, o.order_id
FROM orders o, order_details od, customers c
WHERE o.order_id = od.order_id
AND o.customer_id = c.customer_id)
-- 2) 고객 회사 별 총매출액 & 주문건수
, cte_customers_sales_cnt_cube AS (
SELECT company_name
, contact_title
, country
, sum(sales) AS total_sales
, count(DISTINCT order_id) AS order_cnt
FROM cte_customer_sales_cnt
GROUP BY CUBE (company_name, contact_title, country))
-- 3) 시기 별 총매출액 & 주문건수
, cte_days_sales_cnt_cube AS (
SELECT YEAR
, quarter
, MONTH
, sum(sales) AS total_sale
, count(DISTINCT order_id) AS order_cnt
FROM cte_customer_sales_cnt
GROUP BY CUBE (YEAR, quarter, MONTH))
-- 고객 회사 별 : cte_customers_sales_cnt_cube
-- 시기 별 : cte_days_sales_cnt_cube
SELECT *
FROM cte_days_sales_cnt_cube;
이번 주에 작성한 TIL
[스타터스 TIL] 45일차.SQL 실전 트레이닝 (1) - 데이터 분석, 테이블파악
[스타터스 TIL] 46일차.SQL 실전 트레이닝 (2) - 컬럼 연산자, 날짜/시간형 데이터, 다중 행 함수
[스타터스 TIL] 47일차.SQL 실전 트레이닝 (3) - CTE, 윈도우 함수
[스타터스 TIL] 48일차.SQL 실전 트레이닝 (4) - 제품/카테고리 매출 지표 분석, ABC 분석
[스타터스 TIL] 49일차.SQL 실전 트레이닝 (5) - Z차트, 그룹함수 (GROUPING SETS, ROLLUP, CUBE)
* 유데미 큐레이션 바로가기 : https://bit.ly/3HRWeVL
* STARTERS 취업 부트캠프 공식 블로그 : https://blog.naver.com/udemy-wjtb
본 후기는 유데미-웅진씽크빅 취업 부트캠프 4기 데이터분석/시각화 학습 일지 리뷰로 작성되었습니다.
'웅진X유데미 STARTERS > 주간 학습일지' 카테고리의 다른 글
[유데미 스타터스 취업 부트캠프 4기] 데이터분석/시각화(태블로) - 12주차 학습 일지 (6) | 2023.05.14 |
---|---|
[유데미 스타터스 취업 부트캠프 4기] 데이터분석/시각화(태블로) - 11주차 학습 일지 (0) | 2023.04.22 |
[유데미 스타터스 취업 부트캠프 4기] 데이터분석/시각화(태블로) - 9주차 학습 일지 (0) | 2023.04.09 |
[유데미 스타터스 취업 부트캠프 4기] 데이터분석/시각화(태블로) - 8주차 학습 일지 (0) | 2023.04.02 |
[유데미 스타터스 취업 부트캠프 4기] 데이터분석/시각화(태블로) - 7주차 학습 일지 (0) | 2023.03.26 |