Sql


title: 2026-01-09 author: 강병호 (이름) date: 2026-01-09 (날짜) category: TIL/강병호/2026/01 (파일 경로 : TIL/{이름}/{연}/{월}) layout: post (자유) —

  • 오프라인/온라인 판매 데이터 통합하기

    https://school.programmers.co.kr/learn/courses/30/lessons/131537

    문제 설명

    • 2022년 3월의 오프라인/온라인 상품 판매 데이터
    • 판매 날짜, 상품 ID, 유저 ID, 판매량 출력
    • OFFLINE_SALE 테이블 USER_ID → NULL
    • 판매일 기준 오름차순 정렬, 상품 ID 기준 오름차순, 유저 ID 기준 오름차순 정렬

    발생 에러

    • 에러 1

      image.png

    제출 코드

    • 1차 코드

        -- 코드를 입력하세요
              
        SELECT
            SALES_DATE,
            PRODUCT_ID,
            IFNULL(USER_ID, 'NULL'),
            COUNT(*) AS SALES_AMOUNT
        FROM ONLINE_SALE AS ON_S
        JOIN
            OFFLINE_SALE AS OFF_S ON ON_S.PRODUCT_ID = OFF_S.PRODUCT_ID
        WHERE
            SALES_DATE LIKE '2022-03%'
        GROUP BY
            SALES_DATE
        ORDER BY
            SALES_DATE ASC, PRODUCT_ID ASC, USER_ID ASC
      
    • 2차 코드

        -- 코드를 입력하세요
        SELECT
            ON_S.SALES_DATE AS SALES_DATE,
            ON_S.PRODUCT_ID AS PRODUCT_ID,
            IFNULL(USER_ID, 'NULL') AS USER_ID,
            COUNT(*) AS SALES_AMOUNT
        FROM ONLINE_SALE AS ON_S
        JOIN
            OFFLINE_SALE AS OFF_S ON ON_S.PRODUCT_ID = OFF_S.PRODUCT_ID
        WHERE
            ON_S.SALES_DATE LIKE '2022-03%'
        GROUP BY
            ON_S.SALES_DATE
        ORDER BY
            SALES_DATE ASC, PRODUCT_ID ASC, USER_ID ASC
      
    • 3차 코드

        -- 코드를 입력하세요
        SELECT
            SALES_DATE AS SALES_DATE,
            PRODUCT_ID AS PRODUCT_ID,
            IFNULL(USER_ID, 'NULL') AS USER_ID,
            COUNT(*) AS SALES_AMOUNT
        FROM ONLINE_SALE
              
        UNION ALL
              
        SELECT
            SALES_DATE AS SALES_DATE,
            PRODUCT_ID AS PRODUCT_ID,
            NULL AS USER_ID,
            COUNT(*) AS SALES_AMOUNT
        FROM OFFLINE_SALE
      
      • COUNT(*)의 잘못된 사용: 문제에서 요구하는 SALES_AMOUNT는 해당 판매 기록에 이미 존재하는 컬럼 값입니다. COUNT(*)를 쓰면 판매 기록의 개수를 세게 되는데, 문제에서는 개별 판매 내역의 수량을 그대로 보여주길 원합니다.
      • WHERE 절 누락: 2022년 3월 데이터만 뽑아야 한다는 조건이 빠졌습니다.
      • 날짜 포맷: 출력 예시를 보면 날짜가 2022-03-01 형식이어야 합니다. SQL의 기본 날짜형은 시간 정보를 포함할 수 있으므로 DATE_FORMAT 처리가 필요합니다.
      • USER_IDNULL 처리: 오프라인 판매의 유저 ID는 문자열 'NULL'이 아니라 실제 NULL 값으로 출력되어야 합니다.
    • 정답 코드

        -- 코드를 입력하세요
        SELECT
            DATE_FORMAT(SALES_DATE, '%Y-%m-%d') AS SALES_DATE,
            PRODUCT_ID,
            IFNULL(USER_ID, NULL) AS USER_ID,
            SALES_AMOUNT
        FROM ONLINE_SALE
        WHERE SALES_DATE LIKE '2022-03%'
              
        UNION ALL
              
        SELECT
            DATE_FORMAT(SALES_DATE, '%Y-%m-%d') AS SALES_DATE,
            PRODUCT_ID,
            NULL AS USER_ID,
            SALES_AMOUNT
        FROM OFFLINE_SALE
              
        WHERE SALES_DATE LIKE '2022-03%'
        ORDER BY SALES_DATE ASC, PRODUCT_ID ASC, USER_ID ASC
              
      

results matching ""

    No results matching ""