[25.02.21] 본캠프 5일차 코드카타+sql세션+팀발표+개인스터디

김명서·2025년 2월 21일
1

TIL_sparta

목록 보기
24/60

코드카타

SQL

  1. 보호소에서 중성화 수술을 거친 동물 정보를 알아보려 합니다. 보호소에 들어올 당시에는 중성화1되지 않았지만, 보호소를 나갈 당시에는 중성화된 동물의 아이디와 생물 종, 이름을 조회하는 아이디 순으로 조회하는 SQL 문을 작성해주세요.

첫 시도... 조회결과값이 하나만 나옴(당연히 오답..)
❌문제 였던 부분❌

where ai.SEX_UPON_intake like '%intact%'
and ao.SEX_UPON_OUTCOME like 'spayed%' or 'neutered%'

💡💡💡
찾아낸 문제점: where문 안에 and, or로 여러연산이 묶여있을 때, 나처럼 괄호가 없이 조건문을 만들게 되면, 쿼리가 잘못 해석될 수 있다. 또한 다른사람이 보더라도 어떤 의도로 작성된 쿼리인지 명확하게 만드는 것도 중요.
해결방법: where문에 쓰인 and 이하를 괄호로 묶고 or 이후에도 컬럼 다시 작성.
ex.WHERE (DNO = '20' AND SAL >= 2000) OR (DNO = '10' AND SAL>=1000)

🔻최종 수정한 부분

where ai.SEX_UPON_intake like 'intact%'
and (ao.SEX_UPON_OUTCOME like 'spayed%' 
or ao.SEX_UPON_OUTCOME like 'neutered%')
  1. '경제' 카테고리에 속하는 도서는 도서 ID가 2, 3인 도서이고, 출판일을 기준으로 오름차순으로 정렬하면 다음과 같은 결과가 나와야 합니다.
SELECT book_id, author_name
, date_format(published_date,'%Y-%m-%d') 'published_date'
from book b
join author a
on b.author_id=a.author_id
where category='경제'
order by published_date

38
FOOD_ORDER 테이블에서 2022년 5월 1일을 기준으로 주문 ID, 제품 ID, 출고일자, 출고여부를 조회하는 SQL문을 작성해주세요. 출고여부는 2022년 5월 1일까지 출고완료로 이 후 날짜는 출고 대기로 미정이면 출고미정으로 출력해주시고, 결과는 주문 ID를 기준으로 오름차순 정렬해주세요.

date_format(out_date,'%Y-%m-%d') out_date
, case when out_date <= '2022-05-01' then '출고완료'
    when out_date > '2022-05-01' then '출고대기'
    else '출고미정'
    end '출고여부'

무난히 통과, 이부분만 잘 신경써주면 되는 듯 하다 ~
( 내가 한 실수: 그냥 '미정'으로 작성해버렸는데, 문제에서 요구하는 디테일을 꼭 챙겨야지!)

  1. 상반기 동안 각 아이스크림 성분 타입과 성분 타입에 대한 아이스크림의 총주문량을 총주문량이 작은 순서대로 조회하는 SQL 문을 작성해주세요. 이때 총주문량을 나타내는 컬럼명은 TOTAL_ORDER로 지정해주세요.
SELECT INGREDIENT_TYPE, sum(f.TOTAL_ORDER) TOTAL_ORDER
from FIRST_HALF f
join ICECREAM_INFO i
on f.flavor=i.flavor
group by  INGREDIENT_TYPE
order by  sum(f.TOTAL_ORDER)

sum 잘 해주면 어려운 건 없는 것 같다..!

  1. 동물 보호소에 들어온 동물 중 이름이 Lucy, Ella, Pickle, Rogan, Sabrina, Mitty인 동물의 아이디와 이름, 성별 및 중성화 여부를 조회하는 SQL 문을 작성해주세요.
where 
	name in 
	('Lucy', 'Ella', 'Pickle', 'Rogan', 'Sabrina', 'Mitty')

where 조건문 쓰는게 문제 포인트였던 것 같다

  1. BOOK 테이블에서 2021년에 출판된 '인문' 카테고리에 속하는 도서 리스트를 찾아서 도서 ID(BOOK_ID), 출판일 (PUBLISHED_DATE)을 출력하는 SQL문을 작성해주세요.
    결과는 출판일을 기준으로 오름차순 정렬해주세요.

date_format(published_date,'%Y-%m-%d') PUBLISHED_DATE
where (date_format(published_date,'%Y') = '2021') and (category='인문')
이렇게 날짜 포맷으로 바꿔주고, 조건문 잘 적으면 풀린다.

  1. CAR_RENTAL_COMPANY_CAR 테이블에서 자동차 종류가 'SUV'인 자동차들의 평균 일일 대여 요금을 출력하는 SQL문을 작성해주세요. 이때 평균 일일 대여 요금은 소수 첫 번째 자리에서 반올림하고, 컬럼명은 AVERAGE_FEE 로 지정해주세요.

📌소수 첫 번째 자리에서 반올림하는게 문제에서의 포인트 인 것 같다.
round(컬럼명,_)을 이용했다. _ 부분에는 소수점을 기준으로 몇번째에서 반올림을 할 것인지를 의미한다.
나는 첫째자리에서 반올림해 정수형으로 출력할 것이기 때문에
round(avg(DAILY_FEE),0) AVERAGE_FEE 라고 작성해서 간단히 풀 수 있었다.

💡ROUND 함수 (ps.반올림)

round함수 참고링크

select round(컬럼이름1, 자릿수), ...
from 테이블 이름;

  1. USED_GOODS_BOARD와 USED_GOODS_USER 테이블에서 완료된 중고 거래의 총금액이 70만 원 이상인 사람의 회원 ID, 닉네임, 총거래금액을 조회하는 SQL문을 작성해주세요. 결과는 총거래금액을 기준으로 오름차순 정렬해주세요.

첨에 좀 버벅였는데, 이유는 무의식적으로 where문에 sum(price) >= 700000을 써서 였다...
where문에 집계함수를 쓰지 못한다는 걸 모르는 것도 아니었는데,
having을 가져올 생각을 못했다.......💫💫💫많이 안써봐서 그런것같다.. having 어렵지만 문제 많이 풀어보고싶다 !!
.
❌오류원인❌

where b.status='DONE'
and sum(price) >= 700000
group by u.USER_ID

🔻올바른 문법

where b.status='DONE'
group by u.USER_ID
having sum(price) >= 700000
  1. PRODUCT 테이블에서 만원 단위의 가격대 별로 상품 개수를 출력하는 SQL 문을 작성해주세요. 이때 컬럼명은 각각 컬럼명은 PRICE_GROUP, PRODUCTS로 지정해주시고 가격대 정보는 각 구간의 최소금액(10,000원 이상 ~ 20,000 미만인 구간인 경우 10,000)으로 표시해주세요. 결과는 가격대를 기준으로 오름차순 정렬해주세요.
select s.price_group PRICE_GROUP
, count(*) PRODUCTS
from ( 
    SELECT case 
            when price between '80000' and '89999' then '80000'
            when price between '70000' and '79999' then '70000'
            when price between '60000' and '69999' then '60000'
            when price between '50000' and '59999' then '50000'
            when price between '40000' and '49999' then '40000'
            when price between '30000' and '39999' then '30000'
            when price between '20000' and '29999' then '20000'
            when price between '10000' and '19999' then '10000'
            else '0'
            end price_group
from product
    ) s
group by s.price_group
order by s.price_group

ㅋㅋㅋㅋ정답이긴 한데, 일단 어느 금액대까지 구분지어야할 지 감이 안와서
select* from product로 금액 범위를 확인 하고 나누었다. 다른 풀이를 찾아봤다.

✅solution

FLOOR함수

기본형🔻

FLOOR(number)

🔹원리: FLOOR() 함수는 주어진 number를 넘지 않는 가장 큰 정수를 반환.
즉, 내림(버림) 연산을 수행
🔹적용 대상: 정수를 포함한 실수 전체
ex.
SELECT FLOOR(10.75); -- 결과: 10
SELECT FLOOR(3.99); -- 결과: 3
소수점을 버리고 가장 가까운 "작은" 정수로 변환

🔹주의할 점
SELECT FLOOR(-4.2); -- 결과: -5
소수점을 "버리는" 것이므로 -4가 아니라 -5가 된다 (수직선을 그리고 왼쪽방향 정수를 뱉는다고 생각하면 이해가 편하다.

🔹이문제에 적용해본다면?

SELECT FLOOR(price / 10000) * 10000 AS PRICE_GROUP, 
       COUNT(*) AS PRODUCTS
FROM PRODUCT
GROUP BY FLOOR(price / 10000) * 10000
ORDER BY PRICE_GROUP;

ex. price가 33000원이라면,

FLOOR(33000 / 10000)= 3
따라서 ,
FLOOR(price / 10000) * 10000= 30000
case when은 지정해주는 느낌이었다면, FLOOR함수는 연산을 해주는 느낌인 것 같다.

.
.

  1. MEMBER_PROFILE 테이블에서 생일이 3월인 여성 회원의 ID, 이름, 성별, 생년월일을 조회하는 SQL문을 작성해주세요. 이때 전화번호가 NULL인 경우는 출력대상에서 제외시켜 주시고, 결과는 회원ID를 기준으로 오름차순 정렬해주세요.
date_format(date_of_birth,'%m')='03'

이 조건을 잘못작성해서 오류를 겪었다.
'%m' 이 아니라 %m으로만.. 작은 따옴표를 빼먹었다..!

🧐다시는 date_format(컬럼명,'_')함수에서 ''를 빼먹지 않겠습니다⭐ㅋㅋㅋ


python

  1. 정수 num1과 num2가 주어질 때, num1과 num2의 합을 return하도록 soltuion 함수를 완성해주세요.
solution=lambda num1,num2:num1+num2
  1. 정수 num1과 num2가 매개변수로 주어질 때, num1을 num2로 나눈 값에 1,000을 곱한 후 정수 부분을 return 하도록 solution 함수를 완성해주세요.
solution=lambda num1,num2:round((num1/num2)*1000,0)

이렇게 했는데, 정확도 66점으로 틀림.
why? round()는 반올림하여 변환해줌.

함수변환 방식
int(x)소수점 이하 버림 (반올림 X)
round(x)반올림하여 변환
math.floor(x)내림 (작은 정수로)
math.ceil(x)올림 (큰 정수로)
math.trunc(x)소수점 이하 절삭
solution=lambda num1,num2:int((num1/num2)*1000)

그래서 나는 int()써서 풀었는데
아래 풀이 보고 감탄함.

solution = lambda x, y: 1000 * x // y

수식 살짝 풀어보면, 분모 분자 형태 똑같은데 //가 있으니,,정수만 뱉기..😮

  1. 각에서 0도 초과 90도 미만은 예각, 90도는 직각, 90도 초과 180도 미만은 둔각 180도는 평각으로 분류합니다. 각 angle이 매개변수로 주어질 때 예각일 때 1, 직각일 때 2, 둔각일 때 3, 평각일 때 4를 return하도록 solution 함수를 완성해주세요.
    예각 : 0 < angle < 90
    직각 : angle = 90
    둔각 : 90 < angle < 180
    평각 : angle = 180

아ㄴㅣ ㅋㅋㅋㅋㅋ왜 안돼지 ㅠㅠ하고있는데 angle로 쓴 오타 하나 발견...무슨 엔젤은 엔젤이야....

def solution(angle):
    if 0<angle<90:
        return 1
    elif angle==90:
        return 2
    elif 90 < angle < 180:
        return 3    
    else:
        return 4

다른 분이 푼 숏코드도 봤는데..아직 봐도 이해가 안간다....!!

  1. 정수 n이 주어질 때, n이하의 짝수를 모두 더한 값을 return 하도록 solution 함수를 작성해주세요.

여러 구글링+gpt도움을 받아 하나하나 이해해가며 가장 기본적인 코드를 짠 것 같다.

def solution(n):
    total=0
    
    for t in range(1,n+1):
        if t%2==0:
            total += t
    return total

🔻나중에 참고용으로 보면 좋을 것 같아 정리.
✅ 1. 복합 연산자 표

연산자의미예제
+=더하기 후 할당a += 2a = a + 2
-=빼기 후 할당a -= 3a = a - 3
*=곱하기 후 할당a *= 4a = a * 4
/=나누기 후 할당a /= 2a = a / 2
//=몫 나누기 후 할당a //= 3a = a // 3
%=나머지 연산 후 할당a %= 5a = a % 5
**=거듭제곱 후 할당a **= 2a = a ** 2

.

  1. 정수 배열 numbers가 매개변수로 주어집니다. numbers의 원소의 평균값을 return하도록 solution 함수를 완성해주세요.
def solution(numbers):
    answer = sum(numbers)/len(numbers)
    return answer

생각보다 기본적?이어서 len( )만 구글링으로 복기해서 작성해봤다.

.
.
.


sql세션_숙제

문제1
조건1) first_login_date 컬럼이 2023-01-01 초과인 날짜의
game_account_id, game_actor_id, serverno 를 추출해주세요.

select game_account_id, game_actor_id, serverno
from basic.users
where first_login_date > '2023-01-01'

.
.
문제2
조건1) level 컬럼이 10 초과이고
조건2) serverno컬럼이 1이 아니며
조건3) 아이템 이름 컬럼이 레벨업 패키지 또는 시즌패스이고
조건4) 아이템 획득 경로가 상점에서 구매한 경우의

결과값) first_login_date, ip_addr, exp, zone_id 를 추출하고 first_login_date을 기준으로 내림차순으로 정렬해주세요. 결과값은 아래와 같은 형태입니다. 아래 그림은 전체 중 일부입니다. 사용자의 로컬 환경 및 MySQL 버전에 따라 화면이 다르게 보일 수 있습니다.

select first_login_date, ip_addr, exp, zone_id 
from basic.users
where level > 10
and (serverno != 1 )
and (etc_str2 in ('레벨업 패키지', '시즌패스'))
and (etc_str1 like '%상점%')
order by first_login_date desc

-> '상점에서 구매' 이런식으로 되어있어서, like를 사용해줘야했다.
.
.
문제3
조건1) case when 구문을 사용하여 레벨구간을 아래와 같이 구분해주시고, 컬럼이름을 ‘levelgroup’ 으로 설정해주세요.

[레벨구간]
◦ 1~10Lv 이하
◦ 11~20Lv 이하
◦ 21~30Lv 이하
◦ 31~40Lv 이하
◦ 41~50Lv 이하
◦ 51~60Lv 이하
◦ 61~70Lv 이하
◦ 71~80Lv 이하
◦ 81~90Lv 이하
◦ 91~100Lv

결과값) game_actor_id, level, levelgroup, first_login_date 컬럼을 추출해주시고, first_login_date를 기준으로 내림차순 정렬해주세요. 결과값은 아래와 같아야 합니다. 아래 그림은 전체 중 일부입니다.

select game_actor_id
,level
,case when level > '90' then '91~100Lv'
	when level > '80' then '81~90Lv 이하'
	when level > '70' then '71~80Lv 이하'
	when level > '60' then '61~70Lv 이하'
	when level > '50' then '51~60Lv 이하'
	when level > '40' then '41~50Lv 이하'
	when level > '30' then '31~40Lv 이하'
	when level > '20' then '21~30Lv 이하'
	when level > '10' then '11~20Lv 이하'
	else  '1~10Lv 이하'
end as levelgroup
, first_login_date
from basic.users
order by first_login_date desc

🔹이 문제에서 얻은 교훈
:'작은따옴표' 를 잘하자~~~!!

.
.
.


느낀점&회고

발표에서 생각보다 다양한 관점이 많이 제시된 것같아 흥미롭게 들었다. 이제 진짜 데이터 분석에 대한 팀발표가 진행되면 더 재미있을 것 같다.
SQL세션 끝나자마자 과제를 냈고,
발표가 끝나구 코드카타 문제들을 더 풀었다.
주말동안 WIL을 작성하며 이번주 학습내용을 되돌아보고, 북스터디 책을 완독해야겠다.
이정도면 나름 첫주 잘 적응한거겠지?

profile
경영학도의 데이터분석 성장기💥

0개의 댓글

관련 채용 정보