안녕하세요.
이번 포스팅에서는, SQL의 사칙연산 구문들을 준비했습니다.
실무 데이터 분석을 하신다면 꼼꼼히 봐주세요
사칙연산 다루기
고객데이터와 거래데이터로 간단한 계산을 해보면서 사칙연산 구문들을 살펴보겠습니다
1. 할인률 구하기(할인액/구매액)
select dis_amt / tot_amt as discount_rate
from hds_transactions_rea_csv htrc
결과가 0으로 나옵니다..
왜냐하면 dis_amt, tot_amt 칼럼은 자료형 자체가! 둘다 소수점이 없는 정수형이기 때문입니다
-> 이경우 둘 중 하나라도 소수점이 있으면 소수점이 계산되어 도출됩니다
소수점이 나올 수 있도록
dis_amt 칼럼을 numeric 형식으로 변환하겠습니다(현재는 integer 정수형)
* 참고로 자료형 확인 방법을 알려드리겠습니다. 각 sql 마다 다르니, 각자에 맞게 검색해보세요
소수점까지 나오도록 dis_amt를 numeric 형식으로 변환해서, 소수점을 만들어 계산해줍니다
select
cast(dis_amt as numeric) / tot_amt as discount_rate
from hds_transactions_rea_csv htrc
2. 카테고리별 할인율 구하기(group by)
그냥 할인율만 구하니 감이 안옵니다.
카테고리별로 할인율을 살펴보겠습니다
대략 이런 결과가 나오네요
카테고리별로 집계해서 본격적으로 살펴보겠습니다
select
buyer_nm
,sum(cast(dis_amt as numeric)) / sum(tot_amt) as discount_rate
from hds_transactions_rea_csv htrc
group by 1
order by 2
*참고 : sum이 필요할때, 분모와 분자 둘다 따로따로 sum으로 묶어줍니다
(곱하기,나누기는 가능하면 따로따로 sum하기. * +-는 같이 묶어줘도되는 편)
* 참고. 나누기에서 sum을 분모분자 하나로 묶어 주었을 때 결과와 다릅니다. 유의하세요!
3. 판매액 구하기 (구매액 - 할인액)
4. 등급, 카테고리별 할인률, 판매액 계산하기
group by전에 대략 확인해보겠습니다
고객 등급별로 할인율, 판매액을 sum, group by 해주겠습니다
(이전에 포스팅에서 진행했었죠. group by는 집계전 select의 수만큼)
select
hcrc.cus_stype --고객등급
, htrc.buyer_nm --바잉카테고리
, sum(cast(dis_amt as numeric) / tot_amt) as discount_rate --할인률
, sum(tot_amt - dis_amt) as paid_amt --판매가
from hds_transactions_rea_csv htrc
join hds_customers_rea_csv hcrc on htrc.custid = hcrc.custid
group by 1,2
order by 4 desc
9등급 고객의 캐릭터캐주얼 카테고리가 가장 많은 판매를 일으켰네요
5. 반올림
round(~,~)
기존 할인율 0.00로 나오던 것을 반올림하여 정수로 만들어보겠습니다
select
buyer_nm
, round(sum(cast(dis_amt as numeric)) / sum(tot_amt)) as discount_rate
from hds_transactions_rea_csv htrc
group by 1
order by 2
이 경우 round ( ) 는 소수점 없이 정수형 반올림으로 변환됩니다 (0.9 -> 1)
round(~,2) : 반올림 소수 2번째자리까지
6. 퍼센트
|| '%'
select
buyer_nm
, round(sum(cast(dis_amt as numeric)) / sum(tot_amt), 2) *100 ||'%' as discount_rate
from hds_transactions_rea_csv htrc
group by 1
order by 2
0.00%가 보기싫네요
round(계산식, 2)*100의 계산식을 (이 경우 round(~,2)니까 소수둘째자리까지 나타납니다)
-> round(계산) || '%' 로 바꿔서, 반올림 소수자리를 없애고 퍼센트 표시를 붙입니다
select
buyer_nm
, round(sum(cast(dis_amt as numeric)) / sum(tot_amt)*100) ||'%' as discount_rate
from hds_transactions_rea_csv htrc
group by 1
order by 2
*참고
다른sql 에서는 postgre처럼
round(sum(cast(dis_amt as numeric)) / sum(tot_amt)*100) ||'%'
이렇게 숫자와 문자(계산 || '%')가 잘 안붙는 경우도 있는데
그럴때는
cast(계산 as varchar)||'%'로 변환해 진행합니다
cast(round(sum(cast(dis_amt as numeric)) / sum(tot_amt)*100))as varchar) ||'%'
'IT_SQL' 카테고리의 다른 글
[분석실습] SQL 데이터 사칙연산 심화 (날짜변환, 연산, 고유값) (0) | 2021.11.16 |
---|---|
Question) join 후 sum 오류 (0) | 2021.11.14 |
[분석실습] SQL 데이터 날짜함수 가공하기(now, date_part, current, interval ~) (0) | 2021.11.12 |
Question) case when 절 IN() + like %~% 겹쳐쓰기 불가능? (0) | 2021.11.12 |
[분석실습] SQL 데이터 가공하기(Case When, 범위/그룹화) (0) | 2021.11.12 |