Day30_SQL분석_79‐84_SQL & Tableau - bonniekwon0721/Dataanalytics-study GitHub Wiki
31/MAR/2024
USE mydb;
-- subquery 방법으로 작성
-- Group by 사용
select City, count(StoreNumber) high_sale_store_cnt
from (select City
, StoreNumber
, Sum(SaleDollars) sales_sum
, row_number() over(order by sum(SaleDollars) desc) store_rank
from city_data
group by 1, 2
order by store_rank
) t1
where t1.store_rank <= 20
group by t1.City
order by high_sale_store_cnt desc
;-- with 절 활용
with store_rank_table as (
select City
, StoreNumber
, Sum(SaleDollars) sales_sum
, row_number() over(order by sum(SaleDollars) desc) store_rank
from city_data
group by 1, 2
)
select City, count(StoreNumber) high_sale_store_cnt
from store_rank_table
where store_rank <= 20
group by City
order by high_sale_store_cnt desc;위의 subquery 나 with 모두 같은 결과값을 가져온다.
-- 매출 상위 20위권 스토어의 비중이 많은 지역은 어디인가?
with store_rank_table as (
select City
, StoreNumber
, Sum(SaleDollars) sales_sum
, row_number() over(order by sum(SaleDollars) desc) store_rank
from city_data
group by 1, 2
)
select
City
, count(distinct StoreNumber) total_store_cnt
, SUM(CASE WHEN store_rank <= 20 THEN 1 ELSE 0 END) store_cnt_under_20
-- CASE WHEN (조건) THEN (조건이 True인 경우의 output) ELSE (False일 경우에 output)
-- if a:
-- return a
-- else b
-- END
, ROUND(100 * SUM(CASE WHEN store_rank <= 20 THEN 1 ELSE 0 END) / count(distinct StoreNumber), 2) store_rato_under_20
from store_rank_table
group by city;TEMP TABLE 사용하기
CREATE TEMPORARY TABLE store rank data
SELECT
City
, StoreNumber
,SUM(SaleDollars) sales_sum
,ROW_NUMBER() OVER(ORDER BY SUM(SaleDollars) DESC) store rank
FROM city data
GROUP BY City, StoreNumber;
SELECT *
FROM store rank data;MySql 은 temporary table 을 session/connection 이 종료되었을 때 자동으로 삭제
- 쿼리의 재사용이 필요한 상황에서 사용하는 게 사용하는 입장에선 편리
TEMP TABLE 단점
- 메모리를 차지한다.
- 어떤 테이블인지 바로 파악하기 어렵다.
-- tempor table
create temporary table store_rank_table
select
City
, StoreNumber
, sum(SaleDollars) sales_sum
, row_number() over(order by sum(SaleDollars) desc) store_rank
from city_data
group by 1,2;
select *
from store_rank_table;-- tempor table
create temporary table store_rank_table
select
City
, StoreNumber
, sum(SaleDollars) sales_sum
, row_number() over(order by sum(SaleDollars) desc) store_rank
from city_data
group by 1,2;
select *
from store_rank_table;-- 매출편차가 왜 이렇게 큰지 다시한번 자세히 알아보자
select *, round(sales_sum) sales_sum
from store_rank_table
where store_rank <= 20;- 1, 2, 3 위의 매출의 비중이 가장 높고 그 아래 순위는 매출이 고만고만 하다.
-- 결론
-- 안정적인 수익을 얻고 싶다면?
-- 20위권 순위 비율이 가장 높고 평균 매출이 가장 높은 mount vernon을 추천합니다.
-- 공격적으로 사업을 해서 무조건 1위를 하겠다!!
-- 매출이 높은 store 갯수가 많은 DES MOINES를 추천하겠습니다.
-- 지난시간 recap
-- 5위 중 평균 매출과 매출이 높은 스토어의 비중이 높은 곳은
-- 'MOUNT VERNON'
-- 공격적인 사업을 해 볼만한 곳은
-- 'DES MOINES'
-- 수익이 좋은 주류 종류는 무엇인가?
-- 매출 1등 주류: 저희가 선택한 2가지 도시
USE mydb;
-- row_number : 순위를 매김, 동일한 값이 나와도 다른 값을 참조해서 순위 나눔 (1,1,2,3 -> 1,2,3,4)
-- rank : 순위를 매김, 동일한 값인 경우 동일한 순위 부여 (1,1,2,3 -> 1,1,3,4)
select
t2.ItemDescription
, round(sum(SaleDollars)) totla_sales
, rank() over(order by sum(SaleDollars) desc) item_rank
From city_data t1
left join item_meta t2
ON t1.ItemNumber = t2.ItemNumber
where
t1.City = 'MOUNT VERNON'
OR t1.City = 'DES MOINES'
group by t2.ItemDescription;- TITOS HANDMADE VODKA는 무조건 팔아야겠네
- 매출 10위까지는 무조건 팔아야하지 않을까
- 다른 지역도 이와 유사한가? - 추가로 쿼리 작성하여 확인 필요.
-- 우리가 선택한 2개의 지역은 유사한 주류 순위를 가지고 있을까?
select
t1.City
, t2.ItemDescription
, sum(SaleDollars)
, rank() over(partition by t1.City order by sum(SaleDollars) desc) item_rank -- partition by 로 각 city 의 item 을 그룹핑 해준다.
from city_data t1
left join item_meta t2
on t1.ItemNumber = t2.ItemNumber
where
t1.City = 'MOUNT VERNON'
OR t1.City = 'DES MOINES'
group by t1.City, t2.ItemDescription
order by item_rank
;-- 각 지역별로 몇개의 아이템을 팔고 있는가?
select t1.City, count(distinct t1.ItemNumber)
from city_data t1
where
t1.City = 'MOUNT VERNON'
or t1.City = 'DES MOINES'
group by t1.City;
-- MOUNT VERNON: 262
-- DES MOINES: 690-- 각 아이템들이 매출에 차지하는 비줄은 어느정도인가?
-- 첫번째: city 총 매출이 얼마인지
-- 두번째: city, item 매출이 얼마, 순위가 얼마
select
a.City
, a.ItemDescription
, a.item_rank
, b.total_sales
, round(100 * a.item_total_sales / b.total_sales, 2) item_sales_ratio
from (
select
t1.City
, t2.ItemDescription
, sum(SaleDollars) item_total_sales
, rank() over(partition by t1.City order by sum(t1.SaleDollars) desc) item_rank
from city_data t1
left join item_meta t2
on t1.ItemNumber = t2.ItemNumber
where
t1.City = 'MOUNT VERNON'
or t1.City = 'DES MOINES'
group by t1.City, t2.ItemDescription
) a
left join(
select City, sum(SaleDollars) total_sales
from city_data
group by City
) b
on a.city = b.city
order by item_rank, City
;-- 10위권까지의 판매량 비중을 합쳐본다면?
-- 첫번째 : 아이템의 매출량과, 순위가 필요
-- 두번째 : 지역별로 아이템 총 매출량
-- 순위에서 10위권까지만 사용을 해서 총 매출량 대비 10위권 까지의 아이템 매출합을 나눠주면 => 비중
with item_sales_table as (
select City
, ItemNumber
, sum(SaleDollars) item_total_sales
, rank() over(partition by city order by sum(SaleDollars) desc) item_Rank
from city_data
where
City = 'MOUNT VERNON'
OR City = 'DES MOINES'
group by City, ItemNumber
)
select
item_sales_table.City
, round(sum(100 * item_sales_table.item_total_sales / t2.total_sales), 1) item_sales_ratio_sum
from item_sales_table
left join (
select City, sum(SaleDollars) total_sales
from city_data
group by City
) t2
ON item_sales_table.City = t2.City
where item_rank <= 10
group by item_sales_table.City
;MOUNT VERNON 은 상위 10위 제품만 런칭해도 잘 팔릴 수 있다는 도시로 보인다.
-- 도매업체와 계약을 해야한다면 몇개의 업체와 해야하는가?
create temporary table rank_table
select
City
, ItemNumber
, VendorNumber
, sum(SaleDollars) time_total_sales
, rank() over(partition by City order by sum(SaleDollars) desc) item_rank
from city_data
where
City = 'MOUNT VERNON'
or City = 'DES MOINES'
group by 1,2,3;
select *
from rank_table;
select City, count(distinct VendorNumber)
from rank_table
where item_rank <=10
group by City;-
정보의 Depth 가 얕아도 되는 정보 ex) 미국 전역의 주류 매출 크기 비교
: 미국 전체 지역 지도 형태의 시각화
-
구체적인 수치를 배교해야 하는 정보 ex) 추천하는 지역들의 매출 추이, 성장률
: 지역정보 그래프 , 차트
-
실제 데이터를 직접 이용하면 좋은 정보 ex) 특정지역, 점포의 매출과 판매 비중
: 선택 지역 상세 그래프(성장률 등), 선택 지역 상세 차트 (판매 아이템 정보 등)
- 열선반: 월
- 행선반: 합계 SaleDollars (색상 - City) & 합계 SaleDollars
- 레이블 지정할 마크: 최소/최대
-
이름: 전체
-
값: ‘’
-
색상 필드에 아까 만든 ‘전체’를 넣어주면 우측에 레이블도 표시된다.
-
전체 도구 설명
전체 매출
월: <월(Date)>
Sale Dollars: <합계(Sale Dollars)>
-
City 도구 설명
월: <월(Date)>
City:
Sale Dollars: <합계(Sale Dollars)>
- 이름: 도매상 수
- countd([Vendor Name])
- 이름: 아이템 수
- COUNTD([Item Description])
- 행선반: City
- 열선반: 도매상 수 & 아이템 수
- RUNNING_SUM: 누계 합계
- RUNNING_AVG: 누계 평균
- RUNNING_COUNT: 누계 카운트
- RUNNING_MAX: 누계 최대값
- RUNNING_MIN: 누계 최소값
-
누적매출:
RUNNING_SUM(sum([Sale Dollars])) -
누적매출평균:
RUNNING_AVG(sum([Sale Dollars]))
Lookup 은 다른 행의 값을 가져오거나 차이를 계산해야할 때 많이 사용한다.
SUM([Sale Dollars]) - LOOKUP(SUM([Sale Dollars]), -1)- 열 선반: Date(월)
- 행 선반: 전월 대비 매출 성장액
- 색상: City
- 필터: City - MOUNT VERNON
- 그래프 타입: 영역
-
필터: City - MOUNT VERNON
-
행 선반: Item Description & 합계(Sale Dollars)
-
표현 방식: 텍스트 테이블
-
정렬: 필드 > Sale Dollars > 내림 차순
-
색상: 합계(Sale Dollars)
-
마크 형태: 사각형
{FIXED [City]: sum([Sale Dollars])}- 지역별 매출 합계 필드 > 도구설명에 추가
- 도구설명 편집
Index()- 불연속형 선택
- 레이블: Category Name
- 레이블: 합계(Sales Dollars)
- 크기: 합계(Sales Dollars)
- 색상: 합계(Sales Dollars)
- 레이블: Category Name
- 크기: 합계(Sales Dollars)
- 색상: 합계(Sales Dollars)
- 마크형태: 텍스트
- 행 선반: Vendor Name
- 열 선반: 합계(Sale Dollars)
- 표현방식: 파이차트
-
행 선반: Vendor Name
-
열 선반: 합계(Sale Dollars)
-
표현방식: 가로막대차트
-
정렬(Vendor Name): 필드 > Sale Dollars > 내림차순
-
색상: 합계(Sale Dollars)
-
필터: 계산된필드’순위’ 20
-
필터: City - MOUNT VERNON
- 행 선반: 합계(Sale Dollars)
- 열 선반: Item Description
- 정렬(Item Description): 필드 > Sale Dollars > 내림차순
- 색상: 합계(Sale Dollars)
- 필터: 계산된 필드 ‘순위’ 5
- 도구설명 편집 > 삽입 > 시트
- 필터: City - MOUNT VERNON
TOTAL(SUM([Sale Dollars]))- 행 선반: Store Name & 총매출 & Item Description & 합계(Sale Dollars)
- 총매출: 다음을 사용하여 계산 > Item Description
{FIXED [City], [Store Name]: SUM([Sale Dollars])}{FIXED [City]:sum([Sale Dollars])}-
도시필드 > 지리적 역할 > 주/시/도
-
표현방식 : 지도
-
색상: 합계(총 매출)
-
레이블: 도시
- 이름: Iowa 이름
if [도시] == 'Iowa' then 'Iowa' END<특성(랭킹)>위
도시: <도시>
총 매출: <합계(총 매출)>- 원본 시트: 2022년 매출 동향, 주 별 도매상 및 아이템 수
- 대상 시트: 아이템 매출 순위 Top20, 도매상 매출 순위 Top 20, 전월 대비 매출 성장 정도, 카테고리 매출 순위
- 필터: 선택한 필드 (City)
- 계산된 필드 ‘도시 필터’ 만들기
if [도시 선택] = [City] then True else False end- 매개변수 ‘도시 선택’ 만들기
- 데이터 유형: 문자열
- 허용 가능한 값: 목록
- 다음에서 값 추가: city_data > city
-
필터: 도시 필터 > 참
-
다른 원하는 그래프도 다~
-
동작 > 매개 변수 동작 추가
-
원본시트: 주 별 도매상 및 아이템 수
-
동작 실행 조건: 선택
-
대상 매개 변수: 도시 선택
-
원본 필드: City
-
제목 수정
추천 지역 상세보기 (지역:<매개 변수.도시 선택>)- 도시별 스토어별 아이템별 정보 테이블 적용
- 필터에 ‘도시필터’추가
- 제목 편집
<시트 이름> (도시: <매개 변수.도시 선택>)- 도시별 스토어별 아이템별 정보 테이블 적용
- 필터에 ‘도시필터’추가
- 제목 편집
<시트 이름> (도시: <매개 변수.도시 선택>)-
다운로드 버튼 적용
-
텍스트로 안내: “해당 도시 상세 데이터 다운로드는 오른쪽 버튼을 클릭 해 주세요.”
-
다운로드 버튼 편집
- 내보낼 위치: 크로스탭
- 제목: 도시 정보 상세 데이터 다운로드
Studied from 제로베이스 데이터스쿨