프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

📝 Language: Oracle

 

1
2
3
4
5
6
7
8
9
10
  SELECT USER_ID, 
         PRODUCT_ID
    FROM ONLINE_SALE
GROUP BY USER_ID, 
         PRODUCT_ID
  HAVING COUNT(*)>1
ORDER BY USER_ID, 
         PRODUCT_ID DESC
;
 
 

🙂 확인 사항

1. ONLINE_SALE 테이블

2. 동일한 회원이 동일한 상품을 재구매한 데이터

3. 재구매한 회원 ID, 재구매한 상품 ID 출력

4. 회원ID 기준 오름차순 → 상품ID 기준 내림차순 정렬

 

😮  외의 풀이

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
WITH CONDITIONS AS (
      SELECT USER_ID, 
             PRODUCT_ID, 
             COUNT(*) COUNT_PRODUCT
        FROM ONLINE_SALE
    GROUP BY USER_ID, 
             PRODUCT_ID
)
  SELECT USER_ID, 
         PRODUCT_ID
    FROM CONDITIONS
   WHERE COUNT_PRODUCT > 1
ORDER BY USER_ID, 
         PRODUCT_ID DESC
;
 
 

공통 표현식 사용

 

1
2
3
4
5
6
7
8
9
10
11
12
13
  SELECT DISTINCT USER_ID,
         PRODUCT_ID
    FROM (
      SELECT USER_ID,
             PRODUCT_ID,
             COUNT(*) OVER (PARTITION BY USER_ID, PRODUCT_ID) AS COUNT_PRODUCT
        FROM ONLINE_SALE
    )
   WHERE COUNT_PRODUCT > 1
ORDER BY USER_ID,
         PRODUCT_ID DESC
;
 
 

Inline View + Window Function

 

🚨 Window 함수는

    - 개별 행마다 계산하므로 Group by보다 비효율적일 수 있음

    - Distinct의 추가 작업이 필요하므로 비효율적일 수 있음

 

 

 

🔗 소스 코드
GitHub

 

📚 참고 자료

 

[Algorithm_SQL] 상품 별 오프라인 매출 구하기 (Success)

프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 📝 Langua

hj0216.tistory.com

 

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

📝 Language: Oracle

 

1
2
3
4
5
6
7
8
9
10
  SELECT P.PRODUCT_CODE, 
         SUM(O.SALES_AMOUNT * P.PRICE) SALES
    FROM PRODUCT P
    JOIN OFFLINE_SALE O
      ON P.PRODUCT_ID = O.PRODUCT_ID 
GROUP BY PRODUCT_CODE
ORDER BY SALES DESC, 
         P.PRODUCT_CODE
;
 
 

🙂 확인 사항

1. PRODUCT 테이블, OFFLINE_SALE 테이블

2. 상품코드 별

3. 매출액 합계 출력

4. 매출액 기준 내림차순 → 상품코드 기준 오름차순 정렬

 

😮  외의 풀이

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
WITH TOTALDATE AS(
    SELECT P.PRODUCT_CODE, 
           P.PRICE, 
           O.SALES_AMOUNT
      FROM PRODUCT P
      JOIN OFFLINE_SALE O
        ON P.PRODUCT_ID = O.PRODUCT_ID 
)
  SELECT PRODUCT_CODE, 
         SUM(PRICE * SALES_AMOUNT) SALES
    FROM TOTALDATE
GROUP BY PRODUCT_CODE
ORDER BY SALES DESC, 
         PRODUCT_CODE
;
 
 

- Join문을 공통 표현식으로 사용하여 필요한 데이터만 1차 추출

 

1
2
3
4
5
6
7
8
9
  SELECT DISTINCT PRODUCT_CODE,
        SUM(O.SALES_AMOUNT * P.PRICE) OVER (PARTITION BY PRODUCT_CODE) AS SALES
    FROM PRODUCT P
    JOIN OFFLINE_SALE O
      ON P.PRODUCT_ID = O.PRODUCT_ID
ORDER BY SALES DESC, 
         PRODUCT_CODE
;
 
 

1. Window 함수 사용

    - 테이블에서 로우 집합을 대상으로 계산하는 함수

    - OVER 필수 사용

    - PRODUCT_CODE 별로 O.SALES_AMOUNT * P.PRICE의 SUM값 출력

2. DISTINCE 사용

    - PRODUCT_CODE마다 SUM값이 출력되므로 중복 제거

 

WINDOW FUNCTION 종류

 

🚨 Window 함수는

    - 개별 행마다 계산하므로 Group by보다 비효율적일 수 있음

    - Distinct의 추가 작업이 필요하므로 비효율적일 수 있음

 

 

 

🔗 소스 코드
GitHub

 

📚 참고 자료

 

윈도우 함수

윈도우 함수는 테이블에서 로우 집합을 대상으로 계산하는 함수다. 그 로우 집합은 한 로우에 대해서 어떠한 방식으로 관계된 로우들이다. 이 함수는 로우 집합 단위로 계산한다는 점에서 집계

www.postgresql.kr

 

윈도우함수(WINDOW FUNCTION) 총정리, 순위함수와 분석함수

SQL의 윈도우 함수란 행과 행 간을 비교, 연산, 정의하기 위한 함수이다. 분석함수 또는 순위함수라고 하기도 한다. 다른 함수들처럼 중첩해서 사용할 수는 없지만 서브쿼리에서는 사용가능하다.

for-my-wealthy-life.tistory.com

 

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

📝 Language: Oracle

 

1
2
3
4
5
6
7
  SELECT TRUNC(PRICE/10000)*10000 PRICE_GROUP, 
         COUNT(PRODUCT_ID) PRODUCTS
    FROM PRODUCT
GROUP BY TRUNC(PRICE/10000)
ORDER BY TRUNC(PRICE/10000)
;
 
 

🙂 확인 사항

1. PRODUCT 테이블

2. 만원 단위의 가격대 별 상품 개수 출력

3. 컬럼명 PRICE_GROUP, PRODUCTS

4. 가격대 정보는 각 구간 최소금액으로 표시

5. 가격대 기준 오름차순 정렬

 

😮  외의 풀이

1
2
3
4
5
6
7
8
9
10
11
12
WITH CONDITION AS (
      SELECT TRUNC(PRICE/10000)*10000 PRICE_GROUP,
             COUNT(PRODUCT_ID) PRODUCTS
        FROM PRODUCT
    GROUP BY TRUNC(PRICE/10000)
)
  SELECT PRICE_GROUP,
         PRODUCTS
    FROM CONDITION
ORDER BY PRICE_GROUP
;
 
 

- 공통 표현식 사용

 

1
2
3
4
5
6
7
8
9
10
 SELECT PRICE_GROUP, 
         COUNT(PRICE_GROUP) AS PRODUCTS
    FROM (
       SELECT TRUNC(PRICE/10000)*10000 PRICE_GROUP
         FROM PRODUCT
    )
GROUP BY PRICE_GROUP
ORDER BY PRICE_GROUP
;
 
 

- 인라인 뷰 사용

- SELECT절에 PRODUCT_ID 대신 PRICE_GROUP으로 대체

    - PRODUCT_ID는 PK이고 PRICE는 NOT NULL 조건이므로

    - 🚨 Nullable한 값은 PK값을 대체할 수 없을 수도 있으므로 유의

 

1
2
3
4
5
6
7
8
  SELECT(
      FLOOR(PRICE / 10000* 10000) PRICE_GROUP,
      COUNT(PRODUCT_ID) PRODUCTS
    FROM PRODUCT
GROUP BY (FLOOR(PRICE / 10000* 10000)
ORDER BY PRICE_GROUP
;
 
 

- FLOOR 함수 사용

 

 

 

🔗 소스 코드
GitHub

 

📚 참고 자료

 

[Programmers] 카테고리 별 상품 개수 구하기 (Success)

프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 📝 Langua

hj0216.tistory.com

 

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

📝 Language: Oracle

 

1
2
3
4
5
6
7
  SELECT SUBSTR(PRODUCT_CODE, 12) CATEGORY, 
         COUNT(PRODUCT_ID) PRODUCTS
    FROM PRODUCT
GROUP BY SUBSTR(PRODUCT_CODE, 12)
ORDER BY SUBSTR(PRODUCT_CODE, 12)
;
 
 

🙂 확인 사항

1. PRODUCT 테이블

2. 상품 카테고리 코드 별 상품 개수 출력

3. 상품 카테고리코드 기준 오름차순 정렬

 

😮  외의 풀이

1
2
3
4
5
6
7
8
9
10
11
12
WITH SUBSTRING AS (
      SELECT SUBSTR(PRODUCT_CODE, 12) CATEGORY,
             COUNT(*) PRODUCTS
        FROM PRODUCT
    GROUP BY SUBSTR(PRODUCT_CODE, 12)
)
  SELECT CATEGORY,
         PRODUCTS
    FROM SUBSTRING
ORDER BY CATEGORY
;
 
 

- GROUP BY 결과는 자체적으로 DISTINCT되어 나오므로 공통 표현식에서 COUNT 먼저 처리

- 집계함수는 GROUP BY와 함께 사용

- SELECT절은 GROUP BY 절에 사용된 COL만 사용 가능

 

1
2
3
4
5
6
7
8
9
10
  SELECT CATEGORY, 
         COUNT(CATEGORY) AS PRODUCTS
    FROM (
       SELECT SUBSTR(PRODUCT_CODE, 12) AS CATEGORY
         FROM PRODUCT
    )
GROUP BY CATEGORY
ORDER BY CATEGORY
;
 
 

- 인라인 뷰 사용

- COUNT(CATEGORY)는 그룹 내에서 CATEGORY 열의 각 고유한 값의 개수를 계산

    - SQL 쿼리가 실행될 때, 먼저 FROM 절에서 테이블을 가져오고 필요한 데이터 준비

    - 이후, WHERE 절에 해당하는 데이터를 필터링하고, 필요한 변환 작업 수행

    - GROUP BY가 먼저 실행되어 COUNT를 반환하고, SELECT이 실행

 

 

 

🔗 소스 코드
GitHub

 

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

📝 Language: Oracle

 

1
2
3
4
5
6
7
8
9
10
11
  SELECT MEMBER_ID, 
         MEMBER_NAME, 
         GENDER, 
         TO_CHAR(DATE_OF_BIRTH, 'YYYY-MM-DD') DATE_OF_BIRTH
    FROM MEMBER_PROFILE
   WHERE TLNO IS NOT NULL
     AND EXTRACT(MONTH FROM DATE_OF_BIRTH) = '03'
     AND GENDER = 'W'
ORDER BY MEMBER_ID ASC
;
 
 

🙂 확인 사항

1. MEMBER_PROFILE 테이블

2. 생일이 3월

3. 여성 회원

4. ID, 이름, 성별, 생년월일 조회

5. 전화번호가 Null일 경우, 출력 제외

6. 회원 ID 기준 오름차순 정렬

 

😮  외의 풀이

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
WITH CONDITIONS AS (
    SELECT *
      FROM MEMBER_PROFILE
     WHERE TLNO IS NOT NULL
       AND EXTRACT(MONTH FROM DATE_OF_BIRTH) = 3
       AND GENDER = 'W'
)
  SELECT MEMBER_ID, 
         MEMBER_NAME, 
         GENDER, 
         TO_CHAR(DATE_OF_BIRTH, 'YYYY-MM-DD') DATE_OF_BIRTH
    FROM CONDITIONS
ORDER BY MEMBER_ID ASC
;
 
 

공통 표현식에서 조건만 추출

 

 

 

🔗 소스 코드
GitHub