Re:제로부터 시작하는 갓생
[TIL] 25/01/14 본문
< 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 |