SQL/solvesql Advent of SQL 2024

[SQL] solvesql Advent of SQL 2024 19일차

주댕이 2024. 12. 20. 00:00

# 링크

 

https://solvesql.com/collections/advent-of-sql-2024/

 

solvesql.com

 

https://solvesql.com/problems/refine-cafe-address/

 

solvesql.com

 

 

# 풀이

SELECT
  TRIM(SUBSTR(address, 1, INSTR(address, ' ') - 1)) AS sido,
  TRIM(
    SUBSTR(
      address,
      INSTR(address, ' ') + 1,
      INSTR(SUBSTR(address, INSTR(address, ' ') + 1), ' ') - 1
    )
  ) AS sigungu,
  COUNT(*) AS cnt
FROM
  cafes
GROUP BY
  sido,
  sigungu
ORDER BY
  cnt DESC;
  • SELECT
    • TRIM(SUBSTR(address, 1, INSTR(address, ' ') - 1)) AS sido: address 컬럼의 문자열의 시작부터 첫 번째 공백 바로 전까지의 문자열을 추출한 후 양쪽 공백을 제거한 값을 sido로 저장한다.
      1. INSTR(address, ' '): address 컬럼의 문자열에서 첫 번째 공백의 위치를 찾는다.
      2. SUBTR(address, 1, INSTR(address, ' ') - 1): address 컬럼의 문자열의 시작부터 첫 번째 공백 바로 전까지의 문자열을 추출한다.
      3. TRIM(...): 추출된 문자열에서 양쪽 공백을 제거한다.
    • TRIM(SUBSTR(address, INSTR(address, ' ') + 1, INSTR(SUBSTR(address, INSTR(address, ' ') + 1), ' ') - 1)) AS sigungu: address 컬럼의 문자열의 첫 번째 공백 이후부터 두 번째 공백 바로 전까지의 문자열을 추출한 후 양쪽 공백을 제거한 값을 sigungu로 저장한다.
      1. SUBSTR(address, INSTR(address, ' ') + 1): address 컬럼의 문자열에서 첫 번째 공백 다음 위치부터 끝까지의 문자열을 추출한다.
      2. INSTR(SUBSTR(address, INSTR(address, ' ') + 1), ' '): address 컬럼의 문자열 중 첫 번째 공백 이후의 문자열에서 첫 번째 공백(= 원래 문자열의 두 번째 공백) 위치를 찾는다.
      3. INSTR(SUBSTR(address, INSTR(address, ' ') + 1), ' ') - 1: address 컬럼의 문자열에서 두 번째 공백의 바로 이전 문자의 위치를 찾는다(= 첫 번째 공백 이후부터 두 번째 공백 이전까지의 문자열 길이).
      4. SUBSTR(address, INSTR(address, ' ') + 1, ...): address 컬럼의 문자열의 첫 번째 공백 이후에서 두 번째 공백까지의 문자열을 추출한다.
      5. TRIM(..): 추출된 문자열에서 양쪽 공백을 제거한다.
    • COUNT(*) AS cnt: 데이터의 개수를 계산하여 cnt로 저장한다.
  • FROM cafes: cafes 테이블에서 데이터를 가져온다.
  • GROUP BY sido, sigungu: sido와 sigungu 컬럼을 기준으로 그룹화한다.
  • ORDER BY cnt DESC: cnt 컬럼을 기준으로 내림차순 정렬한다.
728x90