kyejin0412 님의 블로그

[TIL] Week 2-5 SQL solvesql 코드카타 / 파이썬 리스트, 튜플, 딕셔너리 본문

내일배움캠프-데이터분석

[TIL] Week 2-5 SQL solvesql 코드카타 / 파이썬 리스트, 튜플, 딕셔너리

kyejin0412 2025. 10. 31. 20:59

드디어 금요일이다~! 오늘은 개인적인 용무가 있기도 했고 집중력이 한계인건지 집중이 잘 되지 않았다.

데이터 리터러시 강의는 주말로 미뤘다...ㅋㅋㅋ 그래도 최소한 파이썬 진도는 나갔다! 앞으로는 계획을 거창하게 세우지 말아야겠다.

코드카타로 solvesql 난이도 2의 못풀었던 문제들을 해결했다. 집계함수와 case 문을 함께 쓸 때는 집계함수를 case문 바깥이 쓸 것!! 이 개념이 잘 안 잡혀있었다. 이 2주동안 많이 성장한 것 같다. 다음주는 본격적으로 join과 파이썬 세션이 시작된다. 파이썬 주차도 눈 깜짝할 새에 끝날 것이기 때문에 항상 현재에 최선을 다해야겠다. 화이팅!!


[코드카타]

1. 집계함수, CASE 함께 사용시 주의점

CASE 문으로 새로운 컬럼을 만들어 집계하고 싶을 때, CASE 문 밖에서 집계해야 한다.

CASE 문 안에서 사용하면 --> 새로운 컬럼별로 집계하지 않고, 한 행을 집계하기 때문에 의도와 다른 값이 되어버린다.

-- solvesql 3년간 들어온 소장품 집계하기
-- 틀린코드 : CASE 문 안에서 집계함수 사용함
SELECT 
  CASE WHEN A.YEAR = '2014' THEN SUM(A.COUNT) END AS '2014',
  CASE WHEN A.YEAR = '2015' THEN SUM(A.COUNT) END AS '2015',
  CASE WHEN A.YEAR = '2016' THEN SUM(A.COUNT) END AS '2016'
FROM (...)
GROUP BY A.classification


-- 옳은 코드 : CASE 문 밖에서 집계함수 사용!
SELECT classification,
       SUM(CASE WHEN YEAR(acquisition_date) = '2014' THEN 1 ELSE 0 END) AS '2014',
       SUM(CASE WHEN YEAR(acquisition_date) = '2015' THEN 1 ELSE 0 END) AS '2015',
       SUM(CASE WHEN YEAR(acquisition_date) = '2016' THEN 1 ELSE 0 END) AS '2016'
FROM artworks
GROUP BY classification
ORDER BY classification

 

 

2. SELF JOIN, DATE_ADD()

-- solvesql 다음날도 서울숲의 미세먼지 농도는 나쁨
select m1.measured_at as today,
       m2.measured_at as next_day,
       m1.pm10 as pm10,
       m2.pm10 as next_pm10
from measurements m1
join measurements m2 -- 셀프조인
on DATE_ADD(m1.measured_at, INTERVAL 1 DAY) = m2.measured_at
-- 다음 날짜 구하고 싶을 때 +1이 아니라 DATE_ADD(기준날짜, INTERVAL N DAY)를 사용하자!
where m1.pm10 < m2.pm10

 

 

3. 대소문자 상관없이 문자열 비교 - UPPER(), LOWER()

 

upper() 함수를 사용해서 모두 대문자로 바꾸어 비교했다.
모두 소문자로 바꾸는 lower() 함수를 사용해도 된다.

사용법: upper/lower(대상 컬럼) like upper/lower('찾을 문자열')

-- solvesql 기증품 비율 계산하기 
SELECT ROUND((sum(CASE WHEN upper(credit) LIKE upper('%gift%') then 1 else 0 end)
              /COUNT(1))*100,3) AS ratio
FROM artworks

 

 

[파이썬 강의]

1. 리스트

  • 하나의 변수에 여러 개의 값을 담을 수 있는 가변한 시퀀스이다. 아주 많이 쓰인다.
  • 대괄호 '[ ]'를 사용해서 만들고, 각 값은 콤마(,)로 구분한다.
  • 인덱스라는 순서가 중요하다!
  • 인덱스
    • 0은 맨 앞.
    • -1은 맨 마지막. [0, 1, 2, ... , -3, -2, -1]
  • 값 추가 : append('값') 맨 끝에 값 추가
  • 값 변경 : list1[index] = '변경할 값'
  • 슬라이싱 :
    쓰는 법 : list[시작 인덱스:내가 원하는 마지막 인덱스+1]
    마지막 인덱스를 생략하면 끝까지라는 뜻. 
    시작 인덱스를 생략하면 처음부터라는 뜻.
    ex) list[2:5] : 인덱스 2부터 인덱스 4까지 자른다.
    ex) list[-3:] : 뒤에서 3번째부터 끝까지 자른다.

2. 튜플

  • 변경할 수 없는 시퀀스 자료형으로, 여러 개의 요소를 저장하는 컨테이너이다.
  • 한 번 생성된 후에는 요소를 추가, 삭제, 수정할 수 없다는 점이 리스트와 다른 점이다.
  • -> 따라서 데이터를 보호하고 싶을 때 사용한다.
  • 소괄호 '( )' 를 사용하거나 생략해서 만들고, 각 값은 콤마(,)로 구분한다.

 

3. 딕셔너리

  • 키-값 쌍의 데이터를 저장하는 자료구조이다.
  • 키는 유일해야 하지만 값은 중복될 수 있다. 사전처럼 단어가 있고, 설명이 있는 느낌.
  • 중괄호 '{ }' 를 사용해서 만들고, 각 요소는 콤마(,)로 구분한다.
  • 판다스로 데이터분석할 때 표로 만들기가 편한 자료구조이다. 
  • 값 추가/수정: dict['키 이름'] = 값 --> 리스트와 다르게, 인덱스가 아닌 '키'로 접근한다!
  • 실전에서는 데이터를 사전처럼 매칭해서 저장하고 싶을 때 많이 쓴다.

 


참고 링크

https://yeon-dev.tistory.com/135

 

[DB/SQL] UPPER/LOWER 대소문자 구문 없이 LIKE 사용하기

SQL 문제를 풀다보면 '대소문는 구분하지 않습니다.' 라고 적혀있는 경우가 있습니다. 오늘은 대소문자 구분없이 LIKE를 사용하는 방법을 알아 보겠습니다. UPPER() UPPER()를 사용하면 해당 문자열을

yeon-dev.tistory.com

https://greentea-ds.tistory.com/47

 

SolveSQL :: 난이도 2 문제풀이

1. 두 테이블 결합하기역대 올림픽 정보 데이터셋은 역대 올림픽 경기와 관련된 데이터가 들어있는 테이블로 이루어져 있습니다. athletes 테이블에는 역대 올림픽 참가 선수의 이름이 들어 있습

greentea-ds.tistory.com