SQL 공부

SQL 독학, 해커랭크 EASY (ORACLE) CASE, AGGREGATION, ROUND, REPLACE, CONCAT, ||, SUBSTR (3주차) 21

하양 :) 2023. 6. 9. 00:51
반응형
반응형

21.

정삼각형 : 선분 3개 동일

이등변삼각형 : 2개만 동일

일반삼각형 : 선분 길이가 다 다름

삼각형이 아님 : 2개의 변의 길이의 합이 나머지 1개의 변의 길이보다 작거나 같으면 삼각형이 아님

 

문제 : 각 변의 길이를 나타내는 A, B, C 컬럼의 값들을 보고 삼각형이 어떤 TYPE 인지 불러와라!

 

코드 :

 

SELECT 
    CASE 
        WHEN (A = B) AND (C = B) THEN 'Equilateral'
        WHEN (A+B <= C) OR (A+C <= B) OR (B+C <= A) THEN 'Not A Triangle'
        WHEN (A=B) OR (B=C) OR (A=C) THEN 'Isosceles'
        ELSE 'Scalene'
    END
FROM TRIANGLES;

 

 

팁 : CASE WHEN 조건 THEN 불러올값

       END 가 세트

 

 


 

22. 

문제 : CITY 테이블에서 POPULATION 이 100000 초과인 도시의 총 개수를 구하라.

 

 

팁 : Aggregation (집계함수)

  • COUNT : 결과 행들의 개수 (중복된 값도 모두 COUNT)
  • SUM : 결과 행들의 합
  • AVG : 결과 행들의 평균
  • MAX : 결과 행들 중 MAX값을 출력
  • MIN : 결과 행들 중 MIN값을 출력

 

코드 :

SELECT COUNT(NAME) 
FROM CITY
WHERE POPULATION > 100000;

 

 


23.

 

문제 : District 가 California 인 CITY 들의 총 Population 을 구하라

 

팁 : 집계함수

 

코드 :

SELECT SUM(POPULATION) FROM CITY
WHERE DISTRICT = 'California';

 


 

24.

얘도 똑같음 AVG로 인구수 구하면 됨

 

코드 : 

SELECT AVG(POPULATION) FROM CITY
WHERE DISTRICT = 'California';

 

 


25.

문제 : 구한 평균값을 정수가 되도록 내림하시오

 

팁 : 정수로 만들기

반올림 - ROUND( )

올림 -  CEIL( )                       + MYSQL 에선 CEILING( )으로 사용 

내림 - FLOOR( )

 

코드 : SELECT floor(AVG(POPULATION)) FROM CITY;

 


26.

문제 : JPN 에 있는 도시 인구수 총합 구하시오

 

코드 : 

SELECT SUM(POPULATION) FROM CITY
WHERE COUNTRYCODE = 'JPN';

 


27.

문제 : 인구 최대값 - 인구 최소값 구하기

 

코드 : SELECT MAX(POPULATION) - MIN(POPULATION) FROM CITY;

 

 


28.

문제 : 사만다 키보드의 자판 0 이 고장나서 모든 Salary에 0을 입력을 못했다. 그래서 그 상태로 거짓 평균 Salary를 구했는데 해당 값과 실제 0이 다 들어간 Salary의 실제 평균 Salary의 차(Difference)를 구해서 정수로 올림하라.

 

팁 : replace(컬럼명, (바꿀)대상값, (새롭게 입력할)바꿀값)

새롭게 입력할 값을 생략하면 대상값만 삭제하게 됨

 

코드 : SELECT CEIL( AVG(Salary) - AVG( REPLACE(Salary, '0') ) ) FROM EMPLOYEES;

 

---> REPLACE(Salary, '0') : Salary 컬럼에서 모든 0을 다 삭제해버리겠다.

 

 


29.

문제 : 다음과 같은 쿼리 2개를 만들어라.

1. 이름(직업의 첫번째 글자)  형태로 출력

2. 각 직업끼리 묶어서 개수를 센 뒤, There are a total of [해당 직업에 해당하는 명수] [직업 이름 소문자로]s. 형태로 출력 

 

예를 들면,

Samantha Doctor 이라는 행 하나만 있으면

 

Samantha(D)

There are a total of 1 doctors. 라고 둘다 출력해주면 된다.

 

 

팁 :

1. 문자열을 합칠 때 MYSQL 과 달리 ORACLE에서는 CONCAT( )의 인자가 단 2개만 사용할 수 있다.

3개 이상을 합치려면 CONCAT(a, CONCAT(b,c) ) 이런식으로 계속 중첩해주야 하는데 솔직히 성가시다..

그냥 || 라는 합치기 기호를 사용하자!

 

* ORACLE 문자열 합치기 기호는 키보드 상에서 원화표시 위에 있는 ' | ' 작대기 2개를 사용하면 된다.

 

2. ORACLE 에서는 LEFT() 함수를 사용할 수 없으므로 SUBSTR() 로 문자 맨 앞 한자리를 잘라줘야 한다..

 

* SUBSTR(문자열, 몇번째 문자부터시작할건지, 해당위치부터 몇자리수 자를건지? )

 

예를 들면

SUBSTR( 'DUCK' , 2, 1) 이면

"U"가 출력된다.

 

처음에 뭣도 모르고 이렇게 해놓고 오류난다고 쩔쩔매고 있었다..

인자가 3개 이상이 들어가서 invalid number of arguments 라는 오류가 도출됐다.

LEFT도 고쳐야 한다.

 

 

코드 : 

SELECT  Name  ||  '('  ||  SUBSTR(Occupation,1,1)  ||  ')'  FROM OCCUPATIONS
ORDER BY Name;

SELECT 'There are a total of '  ||  COUNT(Occupation)  ||  ' '  ||  LOWER(Occupation)  ||  's.'  FROM  OCCUPATIONS
GROUP BY Occupation ORDER BY COUNT(Occupation), LOWER(Occupation);

 

|| 를 사용하니까 훨씬 직관적으로 잘 보이는 듯하다.

 

 

 

 

 

반응형