업무에 필요한 문자 포맷이 다를때,
SQL로 가공하기
Replace, Substring, Concat
-Query 결과를 바로 사용할 수 없는 경우
- 주소 전체가 아닌 '시도' 정보만 필요할때, 전체 주소가 아닌 '서울'로 문자를 변경하고 싶을 경우
- 보고서를 작성할 때 사업장 명과 함께 지역이 나와야하는데 이때 '사업장[지역]' 과 같은 형태로 문자 포맷을 변경하고 싶을 경우
[REPLACE]
-바뀐 상점이름, 지역이름 한번에 변경
replace(바꿀 컬럼, 현재 값, 바꿀 값)
※예시
select addr "원래 주소",
replace(addr, '문곡리', '문가리') "바뀐 주소"
from food_orders
where addr like '%문곡리%'
--------------food_orders 테이블에서 addr(주소)에 문곡리가 들어가는 값을 문가리로 변경
[SUBSTRING]
-전체 데이터가 아닌 특정 문자만 필요할 때, 그 부분만 조회
substr(조회 할 칼럼, 시작위치, 조회 할 글자수)
※예시
select addr "원래 주소",
substr(addr, 1, 2) "시도"
from food_orders
where addr like '%서울특별시%'
--------------food_orders 테이블에서 addr(주소)에 서울특별시가 들어가는 값들을 '서울'만 나오도록 수정
[CONCAT]
-원하는 문자가 여러 컬럼에 있을 때, 하나로 합쳐서 업무에 필요한 형태로 만들 수 있다.
-합칠(붙일) 수 있는 문자의 종류
- 컬럼
- 한글
- 영어
- 숫자
- 기타 특수문자
concat(붙이고 싶은 값1, 값2, 값3, ........)
※예시
select restaurant_name "원래 이름",
addr "원래 주소"
concat(' [', substring(addr,1,2), '] ' restaurant_name) "바뀐 이름"
from food_orders
where addr like '%서울%'
--------------food_orders 테이블에서 서울시에 있는 음식점을 '[서울] 음식점명' 이라고 수정
문자데이터를 바꾸고
Group by 사용하기
-문자데이터 변경하고 컬럼을 Group by로 묶기 (group by 사용해서 범주별로 수식함수로 연산)
※예시
select substr(addr,1,2) "시도",
cuisine_type "음식 종류"
avg(price) "평균 금액"
from food_orders
where addr like '%서울%'
group by 1,2
--------------food_orders 테이블에서 서울시에 있는 음식타입별 평균 음식 주문금액 구하기
조건에 따라 포맷을 다르게 변경
IF, CASE
-Group by 처럼 조건도 카테고리별로 지정
-예시) 주소의 시도를 '경기도'일때는 '경기도' 아닐 경우 앞의 두글자만 사용할 때
[IF]
-조건을 지정해주는 문법
-원하는 조건에 충족할 때 적용할 방법과 아닌 방법을 지정해 줄 수 있음
if (조건, 조건을 충족할 때, 조건을 충족하지 못할 때)
※예시
select addr "원래 주소",
if(addr like '%평택군%', replace(addr, '문곡리', '문가리' ), addr) "바뀐 주소"
from food_orders
where addr like '%문곡리%'
--------------food_orders 테이블에서 addr(주소) 문곡리가 평택에만 해당될때, 평택 문곡리만 문가리로 변경
[CASE]
-조건을 두개 이상 지정을 해야 할 경우 case 문을 이용하여 여러번의 if문을 적용한 효과를 낼 수 있음
-조건별로 적용할 값을 지정해 줄 수 있음
case when 조건1 then 값(수식)1
when 조건2 then 값(수식)2
else 값(수식)3
end
※예시1
select restaurant_name,
cuisine_type as "원래 음식 타입",
case when (cuisine_type='Korean') then '한식'
else '기타'
end "음식타입"
from food_orders
--------------food_orders 테이블에서 음식타입이 korean 일때는 한식 그 외에는 기타라고 지정
※예시2
select order_id,
price,
quantity,
case when quantity=1 then price
when quantity>=2 then price/quantity
end "음식 단가"
from food_orders
--------------food_orders 테이블에서 주문수량이 1일때는 음식가격 2이상일때는 음식가격/주문수량으로 지정
-조건을 사용할 수 있는 경우
- 새로운 카테고리 만들기 (음식타입과 같은 새로운 카테고리 한식,아시아,미국....)
- 연산식을 적용할 조건 지정(카드와 현금 수수료율이 다를때 연산식을 만들때 다른 계산방식 적용)
- 다른 문법 안에서 적용(여러 컬럼을 합칠 때 조건을 넣어서 구분)
※예시
select order_id,
price,
quantity,
day_of_the_week,
if(day_of_the_week='Weekday', 3000, 3500)*(if(quantity<=3, 1, 1.2)) "할증료"
from food_orders
--------------food_orders 테이블에서 주문시기와 음식 수를 기반으로 배달할증료 구하기
주문시기: 평일 기본료=3000, 주말 기본료=3500
음식수: 3개 이하면 할증 없음, 3개 초과면 기본료*1.2
SQL문에 문제가 없는 것 같은데 오류가 나는 이유
Data Type 오류 해결하기
-avg, substring 등 함수를 썼더니 에러메시지에 data type 뜨면서 실행되지 않을 경우
-사진을 보면 rating 컬럼 명 옆에 abc 라고 표기 되어있는데, 이 표시는 문자로 저장이 되었다는 의미이다.
-출력결과에서 컬럼명 옆의 'ABC' 혹은 '123'을 확인
-문자, 숫자를 혼합하여 함수에 사용할 때에는 데이터 타입을 변경해줘야한다.
1.숫자로 변경
cast(if(rating='Not given', '1', rating) as decimal)
2.문자로 변경
concat(restaurant_name, '-', cast(order_id as char))
'내배캠 > sql' 카테고리의 다른 글
[내일배움캠프/사전캠프] SQL 강의 5주차 (1) | 2024.09.23 |
---|---|
[내일배움캠프/사전캠프] SQL 강의 4주차 (3) | 2024.09.20 |
[내일배움캠프/사전캠프] SQL 강의 2주차 (1) | 2024.09.13 |
[내일배움캠프/사전캠프] SQL 강의 1주차 (1) | 2024.09.12 |