관리 메뉴

FlOWING SINI

액셀보다 쉽고 빠른 SQL - SQL로 업무시간 단축하기 본문

PM TIL/Tech Lecture

액셀보다 쉽고 빠른 SQL - SQL로 업무시간 단축하기

by SINI 2026. 6. 2. 15:21

1. 오늘 학습 키워드

- NULL
- Pivot Table
- Window Function
- RANK
- SUM

- date type

- date_format


2. 오늘 학습 한 내용을 나만의 언어로 정리하기

 

<조회한 데이터에 아무 값이 없을 때>

데이터가 없을 때의 연산 결과 변화 케이스

  • 테이블에 잘못된 값이 들어있는 경우

  • JOIN을 했을 때 값이 없는 경우

 

방법

          • 없는 값을 제외해주기
            - 사용할 수 없는 값일 때 해당 값을 연산에서 제외해주기 → 0으로 간주
            ex) 평균 rating을 구하기
            - NULL = 데이터 없음
            1) NULL 제거를 하지 않았을 

            - is not null = NULL이 아닌 데이터만 있는 것만 보여줌

            2) NULL 제거를 했을 때 (JOIN 시에는 INNER JOIN과 동일)


          • 다른 값을 대신 사용하기

            - 사용할 수 없는 값 대신 다른 값을 대체해서 사용하는 방법
            - 데이터 분석 시에는 평균값 혹은 중앙값 등 대표값을 이용하여 대체
            - 다른 값으로 변경하고 싶을 때

            1) 다른 값이 있을 때 - 조건문 이용하기
            IF(rating>=1, rating, 대체값)
            2) NULL 값일 때
            coalesce(age, 대체값)

            - 예시
            데이터 중 age의 NULL 부분을 다른 값으로 대체해고 싶을 때

            customer 테이블에 없는 데이터 중에 age 만 20으로 채우도록 작성
            'NULL 제거 부분 20'으로 변경

 

 

<조회한 데이터가 상식적이지 않은 값을 가지고 있을 때>

- 조건문으로 값의 범위를 지정
→ 상식적인 수준 안에서 범위 지정

- 예시
case 1. 주문 고객의 나이


ex 1) 주문 고객의 나이

 

 

15세 미만이거나 80세 초과인 경우 15, 80으로 각각 범위 지정

 

 

'15세 미만 = 15세', '80세 초과 = 80세'로 변경

 

 

ex 2) 결제 일자

 

 

<SQL로 Pivot Table 만들기>

Pivot Table
2개 이상의 기준으로 데이터를 집계할 때 보기 쉽게 배열하여 보여주는 것

Pivot Table 기본 구조
ex) 집계 기준 : 일자, 시간 일때 Pivot Table


ex 1) 음식점별 시간별 주문건수  Pivot Table View 만들기
(15~20시 사이, 20시 주문건 기준 내림차순)

음식점별, 시간별 주문건수 집계하기

 

Pivot View 구조 만들기

 

Pivot Talbe 도출하기

 

 

ex 2) 성별, 연령별 주문건수 Pivot Table View 만들기
(나이는 10~59세 사이, 연령순으로 내림차순)

성별, 연령별 주문건수 집계하기

 

집계 도출

Pivot View 구조 만들기

Pivot Table 도출하기

 

 

<업무 시작을 단축시켜 주는 문법> - Window Function - RANK, SUM
Window Function
- 각 행의 관계를 정의하기 위한 함수
- 그룹 내의 연산을 보다 쉽게 수행할 수 있도록 도와

Window Function의 기본구조

- window_function
기능 명을 사용해줌
(SUM,AVG와 같이 기능명이 있음)
- argument
함수에 따라 작성하거나 생략 가능
- partition by
그룹을 나누기 위한 기준
group by절과 유사
- order by
window funtion을 적용할 때 정렬 할 컬럼 기준을 적어줌

    • RANK
      - N번째까지의 대상을 조회하고 싶을 때
      - 특정 기준으로 순위를 매겨주는 기능
      - 주문 건수별 순위 매기기, 결제 시간이 빠른 순으로 순위 매기기 등에 사용

      - 예시
      음식 타입별로 주문 건수가 가장 많은 상점 3개씩 조회하기
      음식 타입별, 음식점별 주문 건수 집계하기

      RANK 함수 적용하기

      3위까지 조회 후 음식 타이별, 순위별로 정렬하기

      도출 및 확인하기

 

 

  • SUM
    - 전체에서 차지하는 비율이나 누적합을 구할 때
    - 합계를 구하는 기능과 동일
    - 누적합이 필요하거나 카테고리별 합계컬럼과 원본 컬럼을 함께 이용할 때 유용하게 사용 가능

    - 예시
    각 음식점의 주문건이 해당 음식 타입에서 차지하는 비율을 구한 후 주문 건이 낮은 순으로 정렬했을 때 누적 합 구하기
    음식 타입별, 음식점별 주문 건수 집계하기

    카테고리별 합, 카테고리별 누적합 구하기

    도출 및 확인하기

    <추가 학습>
    order_count가 동일한 값을 일괄로 더해 cum_sum으로 출력되는 문제 발생

    - 원인
    Window 함수를 사용할 때, SUM으로 동일한 cut_order 값을 가진 여러 행이 있을 경우 이 값을 한번에 더하는 현상 발생
    - 해결 방법
    1. ORDER BY 절에 cnt_order + 추가적인 열에 순서를 부여할 수 있는 restaurant_name을 작성
    2. cut_order 값을 가진 행들이 명확하게 순서가 정해져 누적합이 정상적으로 처리됨
    3. 누적합을 순서대로 표기하기 위해 order by에 cum_cusine을 추가

 

 

<날짜 데이터의 이해>
- 날짜 데이터도 특정한 타입을 가지고 있음
- 년, 월, 일, 시, 분, 초 등의 값을 모두 갖고 있음
- 목적에 따라 월, 주, 일 등으로 포맷 변경 가능

날짜 데이터 예시

 

        • yyyy-mm-dd 형식의 컬럼을 date type으로 변경하기
    • date type을 date_format을 이용하여 년, 월, 일, 주로 조회해보기
      - 년 → Y(4자리), y(2자리)
      - 월 → M, m
      - 일 → d, e
      - 요일 → w
    • 조건 지정 주문건수 구하기
      조건 지정 주문건수 구조
      ex) 년도별 3월의 주문건수 구하기
      년도, 월별 주문건수 구하기

      3월 조건으로 지정하고 년도별로 정렬하기

      도출 및 확인하기

3. 학습하며 겪었던 문제점 & 에러

1)
 학습 과정에서 조회한 데이터가 상식적이지 않은 값을 가지고 있을 때 조건문을 통해 범위를 지정해야 한다는 내용을 접했다. 하지만 상식적인 수준의 범위를 어떻게 판단해야 하는지 어려움을 느꼈다.
 이를 해결하기 위해 데이터가 의미하는 실제 값을 기준으로 적절한 범위를 설정하는 방법을 추가 학습했다. 그 결과 상식적인 범위란 현실적으로 발생 가능한 값의 범위를 의미하며, 이를 통해 오류 데이터를 걸러낼 수 있다는 점을 이해할 수 있었다.
2)
 학습 과정에서 새로운 개념이 연속적으로 등장하다 보니 모든 내용을 완전히 이해하기보다는 기능과 사용 방법을 익히는 데 집중하게 되는 경우가 많았다. 특히 수업이 진행될수록 이러한 부분이 늘어나면서 개념을 명확하게 정리하는 데 어려움을 느꼈다.
 이를 해결하기 위해 학습한 내용을 다시 정리하고 예제를 직접 실행해 보며 복습하는 시간을 가졌다. 그 결과 개념을 한 번에 이해하려 하기보다 반복적인 학습과 실습을 통해 익숙해지는 과정이 필요하다는 점을 느꼈다.
3)
 학습 과정에서 새로운 내용을 학습할 때 한글로 설명된 예시를 보고 이전에 학습했던 내용과 같은 개념이라고 생각하는 경우가 있었다. 하지만 다시 살펴보니 문장이나 사용 방법에 미세한 차이가 있었고, 그 차이에 따라 사용되는 상황도 달랐다.
 이를 해결하기 위해 각 개념의 역할과 사용 목적을 비교하며 학습했다. 그 결과 비슷해 보이는 내용이라도 세부적인 차이가 존재한다는 점을 이해할 수 있었고, 개념을 정확하게 구분하는 연습이 필요하다고 느꼈다.