본문 바로가기
🛠️Skill/SQL

[SQL 문제] UNPIVOT / 구구단 / 삼각형, 사각형 출력 / 숫자의 합, 곱, 짝수, 소수 출력

by Istj_eff 2022. 12. 13.

1. UNPIVOT 예제

SELECT *
 FROM order2
 UNPIVOT (건수 for 아이템 in (BICYCLE, CAMERA, NOTEBOOK));
--열로 된 컬럼명(BICYCLE, CAMERA, NOTEBOOK)들을 '아이템'이라는 컬럼명으로 세로로 출력
--원래 값들은 건수라는 컬럼명으로 세로로 출력
# as 로 이름값 변경
SELECT *
  FROM order2
  UNPIVOT (건수 for 아이템 in (BICYCLE as 'B', CAMERA as 'C', NOTEBOOK as 'N'));

 

2. 구구단 출력 문제

WITH LOOP_TABLE AS (SELECT LEVEL AS NUM
                    FROM DUAL
                    CONNECT BY LEVEL <=9)
SELECT '2' || 'x' || NUM || '=' || 2 * NUM as "2단"
    FROM LOOP_TABLE;
# 구구단 9단 출력 문제 (이중LOOP문)
WITH  LOOP_TABLE  AS  ( SELECT LEVEL   AS NUM
                                FROM DUAL
                                CONNECT BY LEVEL <= 9 ),
         GUGU_TABLE  AS ( SELECT LEVEL + 1 AS GUGU
                                FROM DUAL 
                                CONNECT BY LEVEL <= 8 )
SELECT TO_CHAR( A.NUM ) || ' X ' ||  TO_CHAR( B.GUGU) || ' = ' || 
          TO_CHAR( B.GUGU * A.NUM ) as 구구단
  FROM  LOOP_TABLE A, GUGU_TABLE B;

 

 

3. 삼각형, 사각형 출력 문제

3-1. 직각삼각형 출력

# 직각삼각형 출력 문제
WITH LOOP_TABLE AS (SELECT LEVEL AS NUM
                    FROM DUAL
                    CONNECT BY LEVEL <=8)
SELECT LPAD('★', NUM, '★') AS STAR
FROM LOOP_TABLE;

 

3-2. 삼각형 출력

# 삼각형 출력 문제
WITH LOOP_TABLE AS (SELECT LEVEL AS NUM
                    FROM DUAL
                    CONNECT BY LEVEL <= 8)
SELECT LPAD(' ', 10-NUM, ' ') || LPAD('★', NUM, '★') AS "직각삼각형"
FROM LOOP_TABLE;
# 삼각형 치환변수(&) 사용
WITH LOOP_TABLE AS (SELECT LEVEL AS NUM
                    FROM DUAL
                    CONNECT BY LEVEL <= &숫자1)
SELECT LPAD(' ', &숫자2   -NUM, ' ') || LPAD('★', NUM, '★') AS "직각삼각형"
FROM LOOP_TABLE;

 

3-3. 마름모 출력

  • undefine 명령어로 변수에 담겨있는 내용 지우기고, accept으로 값을 받아 p_num변수에 담는다.
  • prompt로 ‘숫자입력’창을 화면에 출력하고 입력한 숫자를 p_num에 입력한다.
UNDEFINE p_num
Accept p_num PROMPT '숫자입력 : '

SELECT LPAD(' ',&p_num-level, ' ') || RPAD('★', level, '★') AS STAR
    FROM DUAL
    CONNECT BY level < &p_num+1
UNION ALL
SELECT LPAD(' ',level, ' ') || RPAD('★', (&p_num)-level, '★') as star
    FROM dual
    CONNECT BY level < &p_num;

 

3-4. 사각형 출력

UNDEFINE p_n1
UNDEFINE p_n2
ACCEPT p_n1 PROMPT '가로 숫자 입력 :';
ACCEPT p_n2 PROMPT '세로 숫자 입력 :';

WITH LOOP_TABLE AS (SELECT LEVEL AS NUM
                    FROM DUAL
                    CONNECT BY LEVEL <= &p_n2) -- 세로 숫자 
SELECT LPAD('★', &p_n1, '★') as STAR -- 가로 숫자
FROM LOOP_TABLE;

 

 

4. 그룹별 최고값, 최소값 가져오기

CREATE TEMP TABLE TEST_TEMP_TABLE
SELECT *
FROM (SELECT *, ROW_NUMBER() OVER (PARTITION BY USER_NAME ORDER BY AGE) AS ROWIDX
			FROM TEST_TABLE) AS TB01)
WHERE ROWIDX = 1;

 

5. 1~10 숫자의 합

UNDEFINE p_n
ACCEPT p_n prompt '숫자 값 입력:'

SELECT SUM(LEVEL) AS 합계
    FROM DUAL
    CONNECT BY LEVEL <= &p_n;

 

6. 1~10 숫자의 곱

자연로그함수(LN)를 이용해서 입력받은 숫자를 곱하기

UNDEFINE p_n
ACCEPT p_n prompt '숫자 값 입력:'

SELECT ROUND(EXP(SUM(LN(LEVEL)))) 곱
FROM DUAL
CONNECT BY LEVEL <= &P_N;

 

7. 1~10 숫자의 짝수만 출력

UNDEFINE P_N
ACCEPT P_N PROMPT '숫자 값 입력:';

SELECT LISTAGG(LEVEL, ', ') AS 짝수 -- 하나의 열로 출력되게 함
    FROM DUAL
    WHERE MOD(LEVEL, 2) = 0 --MOD 나눈 나머지 출력
    CONNECT BY LEVEL <= &P_N

 

 

8. 1~10 숫자에서 소수만 출력

UNDEFINE P_N
ACCEPT P_N PROMPT '숫자 값 입력:';

WITH LOOP_TABLE AS (SELECT LEVEL AS NUM
                    FROM DUAL
                    CONNECT BY LEVEL <= &P_N)
SELECT L1.NUM AS 소수
    FROM LOOP_TABLE L1, LOOP_TABLE L2
    WHERE MOD(L1.NUM, L2.NUM) = 0 -- 자신의 수와 나눈 나머지 값이 0 이 되는 수로 검색
    GROUP BY L1.NUM
    HAVING COUNT(L1.NUM) = 2; -- 소수는 1과 자신의 수로 나눠지므로 카운트되는 수는 2이다.

 

 

 

 

댓글