Re:제로부터 시작하는 갓생

[TIL] 25/01/14 본문

Daily/TIL

[TIL] 25/01/14

기븜 2025. 1. 14. 16:10

< TIL 반드시 들어가야 할 내용 >

1. 어떤 문제가 있었는지

2. 내가 시도해 본 것들 (자세히 쓰기)

3. 어떻게 해결했는지

4. 뭘 새롭게 알았는지 (자세히 쓰기)


1. 문제

* SQL 공부하다가 문득 대소문자를 꼭 구별해서 써야 하는 경우에 대해 궁금해졌다.

* 매니저님께는 질문하는 김에 문제에 관한 질문도 같이했다 (SQL 기본강의 4-7 실습 7-2)

[실습]
50세 이상 고객의 연령에 따라 경로 할인율을 적용하고, 음식 타입별로 원래 가격과 할인 적용 가격 합을 구하기
[힌트]
(조회 컬럼 : 음식 타입, 원래 가격, 할인 적용 가격, 할인 가격)
* 할인 : (나이-50)*0.005

* 고객 정보가 없는 경우도 포함하여 조회, 할인 금액이 큰 순서대로 정렬

 

2. 시도

* 지연 튜터님과 기경 매니저님께 말벌아저씨 마냥 달려감

호다닥

 

* 문제에 대해 나는 아래와 같이 서브쿼리 없이 풀어보려 노력했다. (원래 시도 내용과 차이있음.. 풀었던 내용 날라감..ㅠ)

-- JOIN은 잘했으나...애초에 다중연산이므로 서브쿼리 없이 풀리지 않는 문제였다

-- 할인적용가격: (나이-50)*0.005 
-- 할인가격: 원래가격-할인금액
SELECT fo.cuisine_type,
       fo.price as '원래가격',
       CASE WHEN c.age >= 50 then (c.age - 50) * 0.005  
            ELSE 0 END as '할인율'
FROM food_orders fo 
LEFT JOIN customers c ON fo.customer_id = c.customer_id 
GROUP BY cuisine_type
order by 4 desc

 

3. 해결

SQL

* 대소문자를 꼭 구별해서 써야 하는 경우는 없으나

명령어(SELECT, FROM, WHERE 등)를 입력할 때는 가독성을 위해 대문자 사용 추천 

특히 별칭, 컬럼명은 소문자로 기재해야 오류를 피할 수 있다.

그리고 SQL은 '예민한' 언어이니 가능하면 협업에서 오류를 피하기 위해

국문컬럼명과 띄어쓰기를 지양하고 가능하면 언더바(_) 사용

* 실습문풀 생각보다 오래 걸림..ㅠ 그리고 문제와 해설 자체가 헷갈리게 되어있어서...특히 WHERE절에 대해..

이 문제에 대해 동일한 질문을 한 사람이 아무도 없었던 것일까... 담에 Q&A방 찾아봐야지..

-- 할인적용가격: (나이-50)*0.005 
-- 할인가격: 원래가격-할인금액
-- # 방법1
SELECT a.cuisine_type,
	   sum(원래가격) as '원래가격',
	   sum(원래가격 - (원래가격*할인율)) as '할인가격',
	   sum(원래가격*할인율) as '할인금액'
FROM 
(
SELECT fo.cuisine_type,
	   fo.price as '원래가격',
	   CASE WHEN c.age >= 50 then (c.age - 50) * 0.005  
	   		ELSE 0 END as '할인율'
FROM food_orders fo 
LEFT JOIN customers c ON fo.customer_id = c.customer_id 
) a
GROUP BY cuisine_type
order by 4 desc

-- # 방법2
SELECT a.cuisine_type,
	   SUM(원래가격) AS '원래가격',
	   SUM(원래가격 - (원래가격*할인율)) as '할인가격'
FROM 
(
SELECT fo.cuisine_type,
	   fo.price as '원래가격',
	   ifnull((c.age-50)*0.005,0) as '할인율'
FROM food_orders fo 
LEFT JOIN customers c ON fo.customer_id = c.customer_id 
and c.age >= 50
) a
GROUP BY cuisine_type
order by 3 desc

 

4. 배움
-- 드디어 JOIN 사용법에 대해 절반정도 익혔다
-- 오류를 피하기 위해 가능하면 LEFT JOIN을 쓸 예정이다

-- LEFT JOIN
select 조회 할 컬럼
from 테이블1 a left join 테이블2 b on a.공통컬럼명=b.공통컬럼명
-- 여기서 null값 제거하려면
where 컬럼 is not null

 

 

'Daily > TIL' 카테고리의 다른 글

[TIL] 25/01/16  (1) 2025.01.17
[TIL] 25/01/15  (0) 2025.01.15
[TIL] 25/01/13  (0) 2025.01.13
[WIL] 7주차_01/06~01/10  (0) 2025.01.10
[TIL] 25/01/10  (0) 2025.01.10