IT_SQL

[분석실습] SQL 데이터 사칙연산 (round, 소수점, 반올림, 퍼센트~)

soyounism 2021. 11. 14. 20:04

안녕하세요.

이번 포스팅에서는, 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) ||'%'