몬그로이

SQL 02 본문

Organizing Docs/SQL Docs

SQL 02

Mon Groy 2024. 6. 27. 20:00

if (조건, 조건을 충족시, 조건 미충족시)

select restaurant_name,

           cuisine_type "원래 음식 타입",

           if(cuisine_type='Korean', '한식', '기타') " 음식 타입"

from food_orders

* 음식 타입이 'Korean' 일 때는 한식, 아닐 때는 기타 로 적어줘

select addr "원래 주소",

if(addr like '%평택군%', replace(addr, '문곡리', '문가리'), addr) "바뀐 주소"

from food_orders

where addr like '%문곡리%'

*주소가 평택군을 포함할 때 문곡리를 문가리로, 아닐때는 그대로 적어줘

 

조합하여 사용하기

select substring(if(email like '%gmail%', replace(email, 'gmail', '@gmail'), email), 10) "이메일 도메인",

from customers

group by 1

*email에 gmail 이 포함되어 있다면, email 이 gmail 인 경우 @gmail 로 바꿔주고(수정),

포함되어있지 않다면 email 그대로 써 줘

그리고 10번째 글자부터 불러와 줘(적어줘)

 

 

Case문 사용하기

select case when cuisine_type = 'Korean' then '한식'

                   when cuisine_type in ('Japanese', 'Chinese') then '아시아'

           else '기타'end "음식타입",

           cuisine_type

from food_orders

*cuisine_type 이 'Korean' 일 때는 '한식',

cuisine_type 이 'Japanese' 나 'Chinese' 라면 '아시아',

나머지는 '기타' 라고 적어줘

select order_idpricequantity,

           case when quantity=1 then price

           when quantity>=2 then price/quantity end "음식 단가"

from food_orders

* 이후 다른 조건이 없을 때 else 생략 가능

 

 

10세 이상, 30세 미만의 고객의 나이와 성별로 그룹 나누기 (이름도 같이 출력)

select case when (age between 10 and 19) and gender='male' then '10대 남성'

                   when (age BETWEEN 10 and 19) and gender = 'female' then '10대 여성'

                   when (age BETWEEN 20 and 29) and gender = 'male' then '20대 남성'

                   when (age BETWEEN 20 and 29) and gender = 'female' then '20대 여성'

                   end

                   name, age, gender

from customers

where age BETWEEN 10 and 29

group by gender = 'female', gender = 'male'

 

 

음식 단가, 음식 종류 별로 그룹 나누기

(Korean = 한식, Japanese, Chinese, Vietnamese, Indian = 아시아식, 그 외 = 기타)

(가격 = 5000, 15000, 그 이상)

select restaurant_nameprice/quantity "단가"cuisine_type, order_id,

          case when (price/quantity <5000) and cuisine_type='Korean' then '한식1'

                   when (price/quantity between 5000 and 15000) and cuisine_type='Korean' then '한식2'

                   when (price/quantity > 15000) and cuisine_type='Korean' then '한식3'

                   when (price/quantity <5000) and cuisine_type in ('Japanese', 'Chinese', 'Thai', 'Vietnamese', 'Indian') then '아시아식1'

                   when (price/quantity between 5000 and 15000) and cuisine_type in ('Japanese', 'Chinese', 'Thai', 'Vietnamese', 'Indian') then '아시아식2'

                   when (price/quantity > 15000) and cuisine_type in ('Japanese', 'Chinese', 'Thai', 'Vietnamese', 'Indian') then '아시아식3'

                   when (price/quantity <5000) and cuisine_type not in ('Korean', 'Japanese', 'Chinese', 'Thai', 'Vietnamese', 'Indian') then '기타1'

                   when (price/quantity between 5000 and 15000) and cuisine_type not in ('Korean', 'Japanese', 'Chinese', 'Thai', 'Vietnamese', 'Indian') then '기타2'

                   when (price/quantity > 15000) and cuisine_type not in ('Korean', 'Japanese', 'Chinese', 'Thai', 'Vietnamese', 'Indian') then '기타3' end "식당 그룹"

from food_orders

 

 

지역과 배달시간을 기반으로 배달수수료 구하기(식당 이름, 주문 번호 함께 출력)

(지역: 서울, 기타 - 서울일 때는 시간 계산 *1.1, 기타일 때는 곱하는 값 없음

  시간: 25분, 30분 - 25분 초과하면 음식 가격의 5%, 30분 초과하면 음식 가격의 10%)

select case when delivery_time > 30 then price*0.1*if(addr like '%서울%', 1.1, 1)

                   when delivery_time > 25 then price*0.05

                   else 0 end "수수료",

                   restaurant_name, order_id, price , delivery_time , addr

from food_orders

 

 

주문 시기와 음식 수 기반으로 배달할증료 구하기

(주문 시기: 평일 기본료 = 3000, 주말 기본료 = 3500

 음식 수 : 3개 이하 - 할증 없음, 3개 초과 - 기본료*1.2)

select case when day_of_the_week='weekday' then 3000*if(quantity>3, 1.2, 1)

                    when day_of_the_week = 'weekend' then 3500*if(quantity>3, 1.2, 1)

                    end "배달 할증료",

                    restaurant_nameorder_idday_of_the_weekquantity

from food_orders

 

 

data type

숫자처럼 보이지만 사실은 문자인 경우, 계산을 위해서 숫자로 바꿔야 한다면 캐스팅이 필요함

--숫자로 변경

cast(if(rating='Not given', '1', rating) as decimal)

 

--문자로 변경

concat(restaurant_name, '-', cast(order_id as char))

*columm 명 앞에 ABC, 123 으로 data type 에 대한 힌트가 있으니 잘 보고 사용하면 됨

 

 다음의 조건으로 배달시간이 늦었는지 판단하는 값을 만들어주세요.

  • 주중 : 25분 이상
  • 주말 : 30분 이상
  1. SQL 문의 기본 구조로 시작
  2. 조건을 여러번 적용할 때 if, case 문 중 어떤 것을 이용할지 결정
  3. 조건에 ‘주중, 주말’ 조건과 ‘배달시간’ 조건을 동시에 줄 때 사용 할 논리연산자 결정

SELECT order_id, restaurant_name, delivery_time, day_of_the_week,

               case when day_of_the_week = 'weekend' and delivery_time >= 25 then '늦음'

                       when day_of_the_week = 'weekday' and delivery_time >= 30 then '늦음'

                       else '늦지 않음' end "지연 여부"

FROM food_orders

더보기

잘못된 풀이 /오류남

 

SELECT case when day_of_the_week = 'weekend' then  if(delivery_time >= 25, 늦음, 정상)

                        when day_of_the_week = 'weekday' then  if(delivery_time >= 30, 늦음, 정상)

                       order_id, restaurant_name, delivery_time, day_of_the_week

FROM food_orders

 

case 문은 'when 뒤의 논리값이 "참일 경우" then 을 반환한다' 라는 논리 이므로

즉, '반환할 것'을 넣는 공간이기 때문에 if를 넣을 수 없으며

분리하고 싶다면 또 다시 when-then 으로 구분해 넣어야 함

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

'Organizing Docs > SQL Docs' 카테고리의 다른 글

SQL 05  (0) 2024.06.29
SQL 03  (0) 2024.06.29
SQL04  (0) 2024.06.29
SQL 01  (0) 2024.06.27
SQL(Structured Query Language)  (0) 2024.05.25