728x90
 

프로그래머스

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

programmers.co.kr

🙂 확인 사항

1. BOOK, BOOK_SALES 테이블

2. 2022년 1월

3. 카테고리 별

4. 도서 판매량 합산

5. 카테고리, 총 판매량 리스트 출력

6. 카테고리 기준 오름차순 정렬

 

 

📝 Language: Oracle

1
2
3
4
5
6
7
8
9
10
  SELECT B.CATEGORY, 
         SUM(BS.SALES) TOTAL_SALES
    FROM BOOK B
    JOIN BOOK_SALES BS
      ON B.BOOK_ID = BS.BOOK_ID
   WHERE TO_CHAR(BS.SALES_DATE, 'YYYY-MM'= '2022-01'
GROUP BY B.CATEGORY
ORDER BY B.CATEGORY
;
 

* TO_CHAR

 

1
2
3
4
5
6
7
8
9
10
11
  SELECT B.CATEGORY, 
         SUM(BS.SALES) AS TOTAL_SALES
    FROM BOOK B
    JOIN BOOK_SALES BS
      ON B.BOOK_ID = BS.BOOK_ID
   WHERE EXTRACT(YEAR FROM BS.SALES_DATE) = 2022
     AND EXTRACT(MONTH FROM BS.SALES_DATE) = 1
GROUP BY B.CATEGORY
ORDER BY B.CATEGORY
;
 

* EXTRACT

 

⭐ TO_CHAR()가  가독성이 좋지만, 각 행마다 실행되어야 하므로 성능에 약간의 영향을 줄 수 있음
  함수를 사용하여 인덱스가 설정된 컬럼의 값을 변환하는 경우,

함수가 적용된 상태 값이 인덱스에 저장된 원래 값과 다르기 때문에 데이터베이스는 인덱스를 효율적으로 사용하지 못하게 됨

 

 

 

🔗 소스 코드
GitHub

 

728x90
728x90
 

프로그래머스

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

programmers.co.kr

🙂 확인 사항

1. REST_INFO 테이블

2. 음식종류별로 즐겨찾기수가 가장 많은

3. 식당의 음식 종류, ID, 식당 이름, 즐겨찾기수를 조회

4. 음식 종류를 기준으로 내림차순 정렬

 

 

📝 Language: Oracle

1
2
3
4
5
6
7
8
9
10
11
12
13
  SELECT FOOD_TYPE, 
         REST_ID, 
         REST_NAME, 
         FAVORITES
    FROM REST_INFO
   WHERE (FOOD_TYPE, FAVORITES) IN (
         SELECT FOOD_TYPE, MAX(FAVORITES) FAVORITES
           FROM REST_INFO
       GROUP BY FOOD_TYPE
)
ORDER BY FOOD_TYPE DESC
;
 
 

* 중첩 서브 쿼리

    - FOOD_TYPE과 FAVORITES를 Set로 잡아 Type 별 최대 즐겨찾기수만 Where절에 포함되도록 함

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
  SELECT FOOD_TYPE, 
         REST_ID, 
         REST_NAME, 
         FAVORITES
    FROM (
        SELECT FOOD_TYPE, 
               REST_ID, 
               REST_NAME, 
               FAVORITES,
               ROW_NUMBER() OVER (PARTITION BY FOOD_TYPE ORDER BY FAVORITES DESC) AS RN
          FROM REST_INFO
    )
   WHERE RN = 1
ORDER BY FOOD_TYPE DESC
;
 
 

* 인라인 뷰

    - 윈도우 함수: ROW_NUMBER

        - FOOD_TYPE별로 FAVORITES를 내림차순하여 RN 추가

 

🚨 Window 함수는

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

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

 

1
2
3
4
5
6
7
8
9
10
11
12
13
 SELECT FOOD_TYPE, 
         REST_ID, 
         REST_NAME, 
         FAVORITES
    FROM REST_INFO r1
   WHERE FAVORITES = (
       SELECT MAX(FAVORITES)
         FROM REST_INFO r2
        WHERE r2.FOOD_TYPE = r1.FOOD_TYPE
   )
ORDER BY FOOD_TYPE DESC
;
 
 

* 중첩 서브 쿼리

    ⭐ 중첩 서브 쿼리에서 집계함수 사용 시, GROUP BY절 필수 X

        - SELECT MAX(FAVORITES) FROM REST_INFO: 전체 테이블에서 최대값 조회

        - WHERE 조건절: 메인 테이블의 FOOD_TYPE과 동일한 서브 테이블의 FOOD_TYPE 중 FAVORITES 최대값 조회

 

 

 

🔗 소스 코드
GitHub

 

 

728x90
728x90
 

프로그래머스

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

programmers.co.kr

 

🙂 확인 사항

1. FOOD_ORDER 테이블

2. 주문 ID, 제품 ID, 출고일자, 출고여부 조회

3. 출고여부는 5월 1일까지 출고완료로 이 후 날짜는 출고 대기로 미정이면 출고미정으로 출력

4. 주문 ID를 기준으로 오름차순 정렬

 

 

📝 Language: Oracle

1
2
3
4
5
6
7
8
9
10
11
12
  SELECT ORDER_ID, 
         PRODUCT_ID, 
         TO_CHAR(OUT_DATE, 'YYYY-MM-DD') OUT_DATE,
         CASE
             WHEN OUT_DATE <= DATE '2022-05-01' THEN '출고완료'
             WHEN OUT_DATE > DATE '2022-05-01' THEN '출고대기'
             ELSE '출고미정'
         END 출고여부
    FROM FOOD_ORDER
ORDER BY ORDER_ID
;
 
 

CASE문

 

1
2
3
4
5
6
7
8
  SELECT ORDER_ID, 
         PRODUCT_ID, 
         TO_CHAR(OUT_DATE, 'YYYY-MM-DD') OUT_DATE,
         DECODE(SIGN(OUT_DATE - DATE '2022-05-02'), -1'출고완료'1'출고대기''출고미정') 출고여부
    FROM FOOD_ORDER
ORDER BY ORDER_ID
;
 
 

DECODE문

* SIGN

- 숫자의 부호를 반환하는 함수

    - 기준일을 5월 2일로 하여 부호 활용

 

🚨 통과는 했지만, 출고일이 5월 2일일 경우, 출고 대기가 나와야하지만 출고 미정이 출력될 수 있음

1
2
3
4
5
6
7
8
  SELECT ORDER_ID, 
         PRODUCT_ID, 
         TO_CHAR(OUT_DATE, 'YYYY-MM-DD') OUT_DATE,
         DECODE(SIGN(OUT_DATE - DATE '2022-05-02'), -1'출고완료'0'출고대기'1'출고대기''출고미정') 출고여부
    FROM FOOD_ORDER
ORDER BY ORDER_ID
;
 
 

정확하게는 위와 같이 0일 경우도 추가해야 함

 

 

 

🔗 소스 코드
GitHub

 

728x90
728x90
 

프로그래머스

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

programmers.co.kr

🙂 확인 사항

1. ANIMAL_INS, ANIMAL_OUTS 테이블

2. 보호소에 들어올 당시에는 중성화되지않았지만,

3. 보호소를나갈 당시에는 중성화된

4. 동물의 아이디, 생물 종, 이름 조회

5. 아이디 순 오름차순 정렬

 

 

📝 Language: Oracle

1
2
3
4
5
6
7
8
9
10
11
SELECT AI.ANIMAL_ID, 
       AI.ANIMAL_TYPE, 
       AI.NAME
  FROM ANIMAL_INS AI
  JOIN ANIMAL_OUTS AO
    ON AI.ANIMAL_ID=AO.ANIMAL_ID
 WHERE AI.SEX_UPON_INTAKE LIKE 'Intact%'
   AND (AO.SEX_UPON_OUTCOME LIKE 'Spayed%' 
    OR AO.SEX_UPON_OUTCOME LIKE 'Neutered%')
    ;
 
 

* WHERE 조건절

- OR 연산자 순위가 AND 연산자보다 낮으므로 () 사용

 

1
2
3
4
5
6
7
8
9
10
SELECT AI.ANIMAL_ID, 
       AI.ANIMAL_TYPE, 
       AI.NAME
  FROM ANIMAL_INS AI
  JOIN ANIMAL_OUTS AO
    ON AI.ANIMAL_ID=AO.ANIMAL_ID
 WHERE AI.SEX_UPON_INTAKE LIKE 'Intact%'
   AND REGEXP_LIKE(AO.SEX_UPON_OUTCOME, '^(Spayed|Neutered)')
   ;
   
 

* 정규 표현식 사용

 

 

 

🔗 소스 코드
GitHub

 

728x90
728x90
 

프로그래머스

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

programmers.co.kr

🙂 확인 사항

1. PLACES 테이블

2. 헤비 유저

3. 아이디 내림차순 정렬

 

 

📝 Language: Oracle

1
2
3
4
5
6
7
8
9
10
  SELECT * 
    FROM PLACES
   WHERE HOST_ID IN (
         SELECT HOST_ID 
           FROM PLACES
       GROUP BY HOST_ID
         HAVING COUNT(HOST_ID) > 1)
ORDER BY ID
;
 
 

* 중첩 SubQuery

 

1
2
3
4
5
6
7
8
9
10
11
12
13
WITH CONDITIONS AS (
      SELECT HOST_ID 
        FROM PLACES
    GROUP BY HOST_ID
      HAVING COUNT(HOST_ID) > 1
)
  SELECT P.*
    FROM PLACES P
    JOIN CONDITIONS C 
      ON P.HOST_ID = C.HOST_ID
ORDER BY P.ID
;
 
 

* 공통 표현식 + Inner Join

 

1
2
3
4
5
6
7
8
9
10
11
12
WITH CONDITIONS AS (
      SELECT HOST_ID 
        FROM PLACES
    GROUP BY HOST_ID
      HAVING COUNT(HOST_ID) > 1
)
  SELECT *
    FROM PLACES
   WHERE HOST_ID IN (SELECT HOST_ID FROM CONDITIONS)
ORDER BY ID
;
 
 

* 공통 표현식 + 중첩 Sub Query

 

⭐Oracle SQL에서는 IN 절 안에 직접 서브쿼리를 넣어야하므로, 공통표현식을 서브쿼리 형태로 작성

 

 

 

🔗 소스 코드
GitHub

 

728x90