카테고리 없음

프로그래머스 ORACLE 문제풀이

HANDA개발 2022. 6. 13. 22:06

1. 

2.OUTER JOIN

 

3.UPPER, LOWER

대소문자 구분없이  'EL'인 Dog 찾기

-- ANIMAL_INS 테이블
SELECT ANIMAL_ID, NAME
FROM ANIMAL_INS
WHERE LOWER(NAME) LIKE '%el%'
AND ANIMAL_TYPE = 'Dog'
ORDER BY NAME;

 

4. CASE WHEN

중성화된 동물은 SEX_UPON_INTAKE 컬럼에 'Neutered' 또는 'Spayed'라는 단어가 들어있습니다. 동물의 아이디와 이름, 중성화 여부를 아이디 순으로 조회하는 SQL문을 작성해주세요. 이때 중성화가 되어있다면 'O', 아니라면 'X'라고 표시해주세요.

SELECT ANIMAL_ID, NAME,
    CASE WHEN SEX_UPON_INTAKE LIKE 'Neutered%' or
              SEX_UPON_INTAKE LIKE 'Spayed%'    
            THEN 'O'
            ELSE 'X'
            END AS 중성화
FROM ANIMAL_INS
ORDER BY ANIMAL_ID ASC;

 

5. DATE계산

입양을 간 동물 중, 보호 기간이 가장 길었던 동물 두 마리의 아이디와 이름을 조회하는 SQL문을 작성해주세요. 이때 결과는 보호 기간이 긴 순으로 조회해야 합니다.

SELECT *
FROM (SELECT INS.ANIMAL_ID, INS.NAME
FROM ANIMAL_INS INS, ANIMAL_OUTS OUTS
WHERE INS.ANIMAL_ID = OUTS.ANIMAL_ID
ORDER BY OUTS.DATETIME - INS.DATETIME DESC)
WHERE ROWNUM <=2;

 

6.DATE 형변형 : TO_CHAR (DATE, 'YYYY-MM-DD')

ANIMAL_INS 테이블에 등록된 모든 레코드에 대해, 각 동물의 아이디와 이름, 들어온 날짜1를 조회하는 SQL문을 작성해주세요. 이때 결과는 아이디 순으로 조회해야 합니다. 

SELECT ANIMAL_ID, NAME, TO_CHAR(DATETIME, 'YYYY-MM-DD')
FROM ANIMAL_INS
ORDER BY ANIMAL_ID ASC;

------

 

1. GROUP BY
동물 보호소에 들어온 동물 중 고양이와 개가 각각 몇 마리인지 조회하는 SQL문을 작성해주세요. 이때 고양이를 개보다 먼저 조회해주세요.

SELECT ANIMAL_TYPE, COUNT(ANIMAL_TYPE) AS count
FROM ANIMAL_INS
GROUP BY ANIMAL_TYPE
ORDER BY ANIMAL_TYPE ASC;

2.GROUP BY, HAVING 
동명 동물 수 찾기

동물 보호소에 들어온 동물 이름 중 두 번 이상 쓰인 이름과 해당 이름이 쓰인 횟수를 조회하는 SQL문을 작성해주세요. 이때 결과는 이름이 없는 동물은 집계에서 제외하며, 결과는 이름 순으로 조회해주세요.

SELECT NAME, COUNT(NAME) AS COUNT
FROM ANIMAL_INS
GROUP BY NAME
HAVING COUNT(NAME)  > 1
ORDER BY NAME ASC;


보호소에서는 몇 시에 입양이 가장 활발하게 일어나는지 알아보려 합니다. 09:00부터 19:59까지, 각 시간대별로 입양이 몇 건이나 발생했는지 조회하는 SQL문을 작성해주세요. 이때 결과는 시간대 순으로 정렬해야 합니다.
SELECT  HOUR, COUNT(*) CNT
FROM    (
            SELECT  TO_CHAR(DATETIME, 'HH24') HOUR
            FROM    ANIMAL_OUTS
        )
WHERE   1=1
        AND HOUR BETWEEN 09 AND 19
GROUP BY HOUR
ORDER BY HOUR;


보호소에서는 몇 시에 입양이 가장 활발하게 일어나는지 알아보려 합니다. 0시부터 23시까지, 각 시간대별로 입양이 몇 건이나 발생했는지 조회하는 SQL문을 작성해주세요. 이때 결과는 시간대 순으로 정렬해야 합니다.

-- tmp 가상테이블 생성
with tmp as (
    select level-1 as hour
    from dual
    connect by level < 25 
)
-- tmp와 LEFT OUTER JOIN
select a.hour
     , nvl(b.count, 0)
  from tmp a
  left outer join
     (
        select to_char(datetime, 'HH24')    as hour
             , count(*)                     as count
          from animal_outs
         group by to_char(datetime, 'HH24')
     ) b
    on a.hour = b.hour
 order by a.hour
;