[KOSTA 교육 9일차] 새로운 ERD로 SQL 문제 풀이 | 새로운 테이블 (KOSPI 테이블)에 대한 SQL 문제 풀이

junjun·2024년 4월 22일

KOSTA

목록 보기
8/48

문제 풀이에 사용되는 ERD

  • 2번 문제 풀 때의 특징 : ORDERS 테이블을 보면, USER_SEQ가 FK일 뿐, PK로 등록되지는 않았다. 이 말은, ORDERS 튜플을 생성할 때, USER_SEQ가 없어도 ( 즉, 주문한 유저가 없어도 ORDERS가 생성될 수 있다는 의미이다. ), 이 말은 ‘비회원 주문’의 케이스로 설명 가능하다!

1. 상품 주문 관리

-- 주문한 상품별 판매량, 판매금액 출력
-- 조건1. 판매량이 높은 순으로 정렬
-- 상품번호, 상품명, 총판매량, 총판매금액

SELECT
    g.GOOD_SEQ as 상품번호,
    g.GOOD_NAME as 상품명,
    SUM(og.ORDER_AMOUNT) as 총판매량,
    SUM(og.ORDER_PRICE) as 총판매금액
FROM
    GOODS g
JOIN
    ORDERS_GOODS og
ON
    g.GOOD_SEQ = og.GOOD_SEQ
GROUP BY
    g.GOOD_SEQ, g.GOOD_NAME
ORDER BY
    총판매량 DESC;
  • 총 판매량과 총 판매 금액을 구해줘야 하니
    그룹함수인 **SUM**을 사용했다.
  • 그룹함수만 단독으로 사용하면 GROUP BY를 사용하지 않아도 되지만, ( 이 때, 그룹은 전체 집합에 대해 적용됨 )
    일반 컬럼 또한 사용해주었으므로, 해당 컬럼에 대한 **GROUP BY**로 묶어줘야 한다.
  • **GROUP BY** 문에 그룹 기준 컬럼 두 개인 **GOOD_SEQ****GOOD_NAME**을 사용했다.
  • ORDER BY 문은 테이블을 다 뽑은 뒤에, 보이는 컬럼명으로 정렬 가능하므로 Alias인 ‘총판매량’을 사용해서 정렬해주었다.

2. 사용자별 구매 통계

-- 회원아이디 총구매횟수 총구매금액
-- 조건1 : 구매금액이 높은 순으로 출력

SELECT
    u.USER_ID as 회원아이디,
    COUNT(*) as 총구매횟수,
    SUM(o.TOT_PRICE) as 총구매금액
FROM
    USERS u
JOIN
    ORDERS o
ON
    u.USER_SEQ = o.USER_SEQ
GROUP BY
    u.USER_ID
ORDER BY
    총구매금액 DESC;
  • COUNT(*)를 통해 조인된 테이블의 튜플 수를 세면, 모든 유저의 총 주문 수가 된다.
    • 이 값을 USER_IDGROUP BY 처리해주면, 유저별 총 구매횟수를 나타낼 수 있다.
  • 또한, 여기서 SUM(TOT_PRICE)를 통해, 유저별로 총 구매 금액을 나타낼 수 있다.
  • ORDER BY는 테이블을 다 뽑고 나서, 진행하기에 해당하는 컬럼의 이름들을 보고 정렬 가능하다. Alias를 사용하여 정렬했다. ( cf. GROUP BY에 Alias인 ‘회원아이디’를 사용하면 안된다 )

3. 휴면회원 통계

구매실적이 전혀 없는 회원 목록 출력
회원아이디 회원명

SELECT
    uu.USER_ID as 회원아이디,
    uu.USER_NAME as 회원명
FROM
    USERS uu
WHERE
    USER_SEQ NOT IN (
                    SELECT
                        u.USER_SEQ
                    FROM
                        USERS u
                    JOIN
                        ORDERS o
                    ON
                        u.USER_SEQ = o.USER_SEQ);
  • 구매한 이력이 있는 유저가 아닌 유저를 검색하기 위해,
    구매한 이력이 있는 유저 아이디를 모아줬다.
  • **NOT IN** 연산을 통해 해당 유저 아이디들을 모아줬다.
  • **MINUS** 집합 연산자를 통해 해결할 수도 있다.
SELECT
    USER_ID as 회원아이디,
    USER_NAME as 회원명
FROM
    USERS
WHERE
    USER_SEQ IN (
                (SELECT
                    USER_SEQ
                FROM
                    USERS)
                MINUS
                (SELECT
                    DISTINCT USER_SEQ
                FROM
                    ORDERS));
  • ORDERS 테이블에는 중복된 USER_SEQ가 있을 수 있기에, DISTINCT를 사용해주었다.

4. 전체 회원 목록 중 휴면 회원이 차지하는 비율?

조건1. 관리자 제외
조건2. 휴면회원은 구매 실적이 전혀 없는 회원

SELECT
        (SELECT
            COUNT(*)
        FROM
            USERS u
        WHERE
            u.USER_SEQ NOT IN (
                    SELECT
                        uu.USER_SEQ
                    FROM
                        USERS uu
                    JOIN
                        ORDERS o
                    ON
                        uu.USER_SEQ = o.USER_SEQ)
        AND
            u.USER_GUBUN != 'a') 
        || '/' ||
        (SELECT
            COUNT(*)
        FROM
            USERS u
        WHERE
            u.USER_GUBUN != 'a') as 회원수
        ,(SELECT
            COUNT(*)
        FROM
            USERS u
        WHERE
            u.USER_SEQ NOT IN (
                    SELECT
                        uu.USER_SEQ
                    FROM
                        USERS uu
                    JOIN
                        ORDERS o
                    ON
                        uu.USER_SEQ = o.USER_SEQ)
        AND
            u.USER_GUBUN != 'a')/
        (SELECT
            COUNT(*)
        FROM
            USERS u
        WHERE
            u.USER_GUBUN != 'a') * 100 || '%' as 휴면회원
FROM
    DUAL;
  • SELECT 절에 분자와 분모를 구하는 스칼라 서브쿼리를 사용하여 해결했다.
  • Oracle에서 문자형 자료형의 CONCATENATE 은
    **||** 연산자를 통해서 수행하는 것을 놓쳤다.
  • ‘관리자를 제외하고’ 라는 조건을, 분자에만 적용했었다. ( 조건이 주어지면 좀 더 생각하는 습관을 들이자 )
  • 오라클이 제공하는 더미 테이블인 DUAL 을 통해 한 줄만 간단히 출력하도록 했다.
  • 사실 DB단에서 이렇게 처리하는 것보다, 오라클에서는 회원수 | 비활성 회원수 데이터만 어플리케이션 단에 넘겨주고, 개발자가 WAS 로직에서 구성을 한 뒤 ( Model ), 보여주는 방식 ( ‘/’ 를 표시해주거나, ‘%’를 붙여주는 등등 ) 은 WEB으로 보여주면 된다,(View)

[결과]

회원수 | 휴면회원

1/4 | 25%

5. 각 회원별로 매니저-회원 관계를 출력하시오

조건 1. 관리자 제외
조건 2. 매니저 번호 오름차순, 회원번호 오름차순 정렬

SELECT
    m.USER_NAME as 매니저,
    u.USER_NAME as 회원
FROM
    USERS u
JOIN
    USERS m
ON
    u.MGR_SEQ = m.USER_SEQ
WHERE
    u.USER_GUBUN != 'a'
ORDER BY
    m.USER_SEQ ASC, u.USER_SEQ ASC;
  • Self Join을 활용하는 문제였다.
  • 관리자를 제외하는 조건이 있으므로,
    JOIN 결과인 테이블에 대해 u.USER_GUBUN‘a’가 아닌 조건을 추가해줬다.
  • 조인 시, Driving Table의 크기를 줄이는 것이 효율이 더 좋으므로, 다음과 같이 쿼리를 수정헀다.
  • 매니저 번호와 유저 번호로 정렬해주는 조건을 ORDER BY를 통해 적용해주었다.
SELECT
    m.USER_NAME as 매니저,
    u.USER_NAME as 회원
FROM
    (SELECT
        u.USER_SEQ,
        u.MGR_SEQ,
        u.USER_NAME
    FROM
        USERS u
    WHERE
        u.USER_GUBUN != 'a') u
JOIN
    USERS m
ON
    u.MGR_SEQ = m.USER_SEQ
ORDER BY
    m.USER_SEQ ASC, u.USER_SEQ ASC;
  • 서브쿼리 내의 테이블의 Alias는 메인쿼리로 나오면 의미가 없어진다.
    • 서브쿼리 내의 내용은 그 영역에서 따로 노는거라 생각하면 된다.

6. 주문, 상품, 업체 대시보드 현황판

총주문수량 총주문금액 총회원수 총업체수 총상품수
AMT PRICE UCNT CCNT GCNT

SELECT
    (SELECT
        SUM(ORDER_AMOUNT)
    FROM
        ORDERS_GOODS) as AMT,
    (SELECT
        SUM(TOT_PRICE)
    FROM
        ORDERS) as  PRICE,
    (SELECT
        COUNT(*)
    FROM
        USERS) as UCNT,
    (SELECT
        COUNT(*)
    FROM
        COMPANY) as CCNT,
    (SELECT
        COUNT(*)
    FROM
        GOODS) as GCNT
FROM
    DUAL;
  • **SELECT** 절의 서브쿼리를 이용해서 대시보드를 만들었다.
  • 주어진 조건대로 Alias를 붙여주고, **DUAL** 테이블을 활용해 한 줄로 출력했다.

7. 월별 판매 실적

1월 2월 3월 4월… 12월 ( 2018년 기준 )

SELECT
    (SELECT
        NVL(SUM(TOT_PRICE),0)
    FROM
        ORDERS
    WHERE
        ORDER_DATE BETWEEN
        TO_DATE('2018/01/01', 'YYYY-MM-DD')
        AND
        TO_DATE('2018/02/01', 'YYYY-MM-DD')) as "1월",
    (SELECT
        NVL(SUM(TOT_PRICE),0)
    FROM
        ORDERS
    WHERE
        ORDER_DATE BETWEEN
        TO_DATE('2018/02/01', 'YYYY-MM-DD')
        AND
        TO_DATE('2018/03/01', 'YYYY-MM-DD')) as "2월",
    (SELECT
        NVL(SUM(TOT_PRICE),0)
    FROM
        ORDERS
    WHERE
        ORDER_DATE BETWEEN
        TO_DATE('2018/03/01', 'YYYY-MM-DD')
        AND
        TO_DATE('2018/04/01', 'YYYY-MM-DD')) as "3월",
    (SELECT
        NVL(SUM(TOT_PRICE),0)
    FROM
        ORDERS
    WHERE
        ORDER_DATE BETWEEN
        TO_DATE('2018/04/01', 'YYYY-MM-DD')
        AND
        TO_DATE('2018/05/01', 'YYYY-MM-DD')) as "4월",
    (SELECT
        NVL(SUM(TOT_PRICE),0)
    FROM
        ORDERS
    WHERE
        ORDER_DATE BETWEEN
        TO_DATE('2018/05/01', 'YYYY-MM-DD')
        AND
        TO_DATE('2018/06/01', 'YYYY-MM-DD')) as "5월",
    (SELECT
        NVL(SUM(TOT_PRICE),0)
    FROM
        ORDERS
    WHERE
        ORDER_DATE BETWEEN
        TO_DATE('2018/06/01', 'YYYY-MM-DD')
        AND
        TO_DATE('2018/07/01', 'YYYY-MM-DD')) as "6월",
    (SELECT
        NVL(SUM(TOT_PRICE),0)
    FROM
        ORDERS
    WHERE
        ORDER_DATE BETWEEN
        TO_DATE('2018/07/01', 'YYYY-MM-DD')
        AND
        TO_DATE('2018/08/01', 'YYYY-MM-DD')) as "7월",
    (SELECT
        NVL(SUM(TOT_PRICE),0)
    FROM
        ORDERS
    WHERE
        ORDER_DATE BETWEEN
        TO_DATE('2018/08/01', 'YYYY-MM-DD')
        AND
        TO_DATE('2018/09/01', 'YYYY-MM-DD')) as "8월",
    (SELECT
        NVL(SUM(TOT_PRICE),0)
    FROM
        ORDERS
    WHERE
        ORDER_DATE BETWEEN
        TO_DATE('2018/09/01', 'YYYY-MM-DD')
        AND
        TO_DATE('2018/09/01', 'YYYY-MM-DD')) as "9월",
    (SELECT
        NVL(SUM(TOT_PRICE),0)
    FROM
        ORDERS
    WHERE
        ORDER_DATE BETWEEN
        TO_DATE('2018/10/01', 'YYYY-MM-DD')
        AND
        TO_DATE('2018/11/01', 'YYYY-MM-DD')) as "10월",
    (SELECT
        NVL(SUM(TOT_PRICE),0)
    FROM
        ORDERS
    WHERE
        ORDER_DATE BETWEEN
        TO_DATE('2018/11/01', 'YYYY-MM-DD')
        AND
        TO_DATE('2018/12/01', 'YYYY-MM-DD')) as "11월",
    (SELECT
        NVL(SUM(TOT_PRICE),0)
    FROM
        ORDERS
    WHERE
        ORDER_DATE BETWEEN
        TO_DATE('2018/12/01', 'YYYY-MM-DD')
        AND
        TO_DATE('2019/01/01', 'YYYY-MM-DD')) as "12월"
FROM
    DUAL;
  • 다소 노가다성 쿼리이지만, 현업에서 대시보드 업무 시 많이 사용한다 한다.
  • SELECT 절의 서브쿼리 + DUAL 테이블의 조합으로 원하는 데이터를 피봇처럼 뽑아내었다.
  • **BETWEEN** ~ **AND** ~ 연산자를 통해 날짜의 범위를 처리해주었다.
  • 주문 건수가 없을 수 있어서,
    NVL을 통해 NULL 일 때 0으로 표시해주는 처리를 해주었다.
  • DECODE를 통해서도 해결할 수 있습니다.
SELECT
    SUM(DECODE(TO_CHAR(ORDER_DATE, 'MM'),'01', TOT_PRICE, 0)) as M01,
    SUM(DECODE(TO_CHAR(ORDER_DATE, 'MM'),'02', TOT_PRICE, 0)) as M02,
    SUM(DECODE(TO_CHAR(ORDER_DATE, 'MM'),'03', TOT_PRICE, 0)) as M03,
    SUM(DECODE(TO_CHAR(ORDER_DATE, 'MM'),'04', TOT_PRICE, 0)) as M04,
    SUM(DECODE(TO_CHAR(ORDER_DATE, 'MM'),'05', TOT_PRICE, 0)) as M05,
    SUM(DECODE(TO_CHAR(ORDER_DATE, 'MM'),'06', TOT_PRICE, 0)) as M06,
    SUM(DECODE(TO_CHAR(ORDER_DATE, 'MM'),'07', TOT_PRICE, 0)) as M07,
    SUM(DECODE(TO_CHAR(ORDER_DATE, 'MM'),'08', TOT_PRICE, 0)) as M08,
    SUM(DECODE(TO_CHAR(ORDER_DATE, 'MM'),'09', TOT_PRICE, 0)) as M09,
    SUM(DECODE(TO_CHAR(ORDER_DATE, 'MM'),'10', TOT_PRICE, 0)) as M10,
    SUM(DECODE(TO_CHAR(ORDER_DATE, 'MM'),'11', TOT_PRICE, 0)) as M11,
    SUM(DECODE(TO_CHAR(ORDER_DATE, 'MM'),'12', TOT_PRICE, 0)) as M12
FROM
    ORDERS o
  • 사실 이 쿼리는
    월별 누계를 계산해서 세로로 보여주는 것입니다.
  • 결과를 가로로 보여주려면, GROUP BY를 사용해주면 됩니다.
    • 다만, GROUP BY를 사용하면 해당하는 월의 주문내역이 없으면
      해당 월이 표현되지 않게 됩니다.
    • 무조건 월별로 누계를 내서 보여줘야한다면, SELECT 서브쿼리를 사용하는게 좋을 것입니다. ( PIVOT )

KOSPI Table에 대한 쿼리

[ DDL ]

drop table kospi;
 CREATE TABLE "KOSPI" 
   (	"RDATE" DATE, 
	"OPRICE" NUMBER(12,0), 
	"HPRICE" NUMBER(12,0), 
	"LPRICE" NUMBER(12,0), 
	"CPRICE" NUMBER(12,0), 
	"VOL" NUMBER(15,0), 
	"TICKER" CHAR(6 BYTE), 
	"TNAME" VARCHAR2(36 BYTE)
   ) ;

Insert into KOSPI (RDATE,OPRICE,HPRICE,LPRICE,CPRICE,VOL,TICKER,TNAME) values (to_date('2022-01-31 00:00:00','YYYY-MM-DD HH24:MI:SS'),114034,114617,56531,63331,16588524,'086520','에코프로');
Insert into KOSPI (RDATE,OPRICE,HPRICE,LPRICE,CPRICE,VOL,TICKER,TNAME) values (to_date('2022-02-28 00:00:00','YYYY-MM-DD HH24:MI:SS'),66148,84506,61679,84020,14876714,'086520','에코프로');
Insert into KOSPI (RDATE,OPRICE,HPRICE,LPRICE,CPRICE,VOL,TICKER,TNAME) values (to_date('2022-03-31 00:00:00','YYYY-MM-DD HH24:MI:SS'),83534,93928,80912,89459,9429015,'086520','에코프로');
Insert into KOSPI (RDATE,OPRICE,HPRICE,LPRICE,CPRICE,VOL,TICKER,TNAME) values (to_date('2022-04-30 00:00:00','YYYY-MM-DD HH24:MI:SS'),88877,102281,77026,83534,10879277,'086520','에코프로');
Insert into KOSPI (RDATE,OPRICE,HPRICE,LPRICE,CPRICE,VOL,TICKER,TNAME) values (to_date('2022-05-31 00:00:00','YYYY-MM-DD HH24:MI:SS'),81786,90722,76444,80135,6534788,'086520','에코프로');
Insert into KOSPI (RDATE,OPRICE,HPRICE,LPRICE,CPRICE,VOL,TICKER,TNAME) values (to_date('2022-06-30 00:00:00','YYYY-MM-DD HH24:MI:SS'),79358,80426,62068,69547,7182731,'086520','에코프로');
Insert into KOSPI (RDATE,OPRICE,HPRICE,LPRICE,CPRICE,VOL,TICKER,TNAME) values (to_date('2022-07-31 00:00:00','YYYY-MM-DD HH24:MI:SS'),69547,93733,63525,86740,15576902,'086520','에코프로');
Insert into KOSPI (RDATE,OPRICE,HPRICE,LPRICE,CPRICE,VOL,TICKER,TNAME) values (to_date('2022-08-31 00:00:00','YYYY-MM-DD HH24:MI:SS'),86740,119474,85768,111606,21719083,'086520','에코프로');
Insert into KOSPI (RDATE,OPRICE,HPRICE,LPRICE,CPRICE,VOL,TICKER,TNAME) values (to_date('2022-09-30 00:00:00','YYYY-MM-DD HH24:MI:SS'),110440,145214,104806,112383,20454470,'086520','에코프로');
Insert into KOSPI (RDATE,OPRICE,HPRICE,LPRICE,CPRICE,VOL,TICKER,TNAME) values (to_date('2022-10-31 00:00:00','YYYY-MM-DD HH24:MI:SS'),114520,150556,109469,137929,15283802,'086520','에코프로');
Insert into KOSPI (RDATE,OPRICE,HPRICE,LPRICE,CPRICE,VOL,TICKER,TNAME) values (to_date('2022-11-30 00:00:00','YYYY-MM-DD HH24:MI:SS'),138706,140066,115880,135986,14005836,'086520','에코프로');
Insert into KOSPI (RDATE,OPRICE,HPRICE,LPRICE,CPRICE,VOL,TICKER,TNAME) values (to_date('2022-12-31 00:00:00','YYYY-MM-DD HH24:MI:SS'),137832,139386,102700,103000,11364458,'086520','에코프로');
Insert into KOSPI (RDATE,OPRICE,HPRICE,LPRICE,CPRICE,VOL,TICKER,TNAME) values (to_date('2023-01-31 00:00:00','YYYY-MM-DD HH24:MI:SS'),106000,129900,105600,122800,7527301,'086520','에코프로');
Insert into KOSPI (RDATE,OPRICE,HPRICE,LPRICE,CPRICE,VOL,TICKER,TNAME) values (to_date('2023-02-28 00:00:00','YYYY-MM-DD HH24:MI:SS'),123500,295000,123500,285500,35908899,'086520','에코프로');
Insert into KOSPI (RDATE,OPRICE,HPRICE,LPRICE,CPRICE,VOL,TICKER,TNAME) values (to_date('2023-03-31 00:00:00','YYYY-MM-DD HH24:MI:SS'),286500,531000,272000,498500,42943406,'086520','에코프로');
Insert into KOSPI (RDATE,OPRICE,HPRICE,LPRICE,CPRICE,VOL,TICKER,TNAME) values (to_date('2023-04-30 00:00:00','YYYY-MM-DD HH24:MI:SS'),508000,820000,472500,730000,37830674,'086520','에코프로');
Insert into KOSPI (RDATE,OPRICE,HPRICE,LPRICE,CPRICE,VOL,TICKER,TNAME) values (to_date('2023-05-31 00:00:00','YYYY-MM-DD HH24:MI:SS'),750000,778000,499000,563000,20158207,'086520','에코프로');
Insert into KOSPI (RDATE,OPRICE,HPRICE,LPRICE,CPRICE,VOL,TICKER,TNAME) values (to_date('2023-06-30 00:00:00','YYYY-MM-DD HH24:MI:SS'),568000,799000,555000,754000,19415964,'086520','에코프로');
Insert into KOSPI (RDATE,OPRICE,HPRICE,LPRICE,CPRICE,VOL,TICKER,TNAME) values (to_date('2022-01-31 00:00:00','YYYY-MM-DD HH24:MI:SS'),277000,316000,256000,265000,8345521,'005490','POSCO홀딩스');
Insert into KOSPI (RDATE,OPRICE,HPRICE,LPRICE,CPRICE,VOL,TICKER,TNAME) values (to_date('2022-02-28 00:00:00','YYYY-MM-DD HH24:MI:SS'),274500,292000,261000,285000,5751092,'005490','POSCO홀딩스');
Insert into KOSPI (RDATE,OPRICE,HPRICE,LPRICE,CPRICE,VOL,TICKER,TNAME) values (to_date('2022-03-31 00:00:00','YYYY-MM-DD HH24:MI:SS'),284500,306500,275500,293000,6379149,'005490','POSCO홀딩스');
Insert into KOSPI (RDATE,OPRICE,HPRICE,LPRICE,CPRICE,VOL,TICKER,TNAME) values (to_date('2022-04-30 00:00:00','YYYY-MM-DD HH24:MI:SS'),289500,300000,276000,289000,5225366,'005490','POSCO홀딩스');
Insert into KOSPI (RDATE,OPRICE,HPRICE,LPRICE,CPRICE,VOL,TICKER,TNAME) values (to_date('2022-05-31 00:00:00','YYYY-MM-DD HH24:MI:SS'),285000,298000,272000,289000,4952487,'005490','POSCO홀딩스');
Insert into KOSPI (RDATE,OPRICE,HPRICE,LPRICE,CPRICE,VOL,TICKER,TNAME) values (to_date('2022-06-30 00:00:00','YYYY-MM-DD HH24:MI:SS'),291500,295000,229500,230500,6362003,'005490','POSCO홀딩스');
Insert into KOSPI (RDATE,OPRICE,HPRICE,LPRICE,CPRICE,VOL,TICKER,TNAME) values (to_date('2022-07-31 00:00:00','YYYY-MM-DD HH24:MI:SS'),234500,243000,221000,242000,5123378,'005490','POSCO홀딩스');
Insert into KOSPI (RDATE,OPRICE,HPRICE,LPRICE,CPRICE,VOL,TICKER,TNAME) values (to_date('2022-08-31 00:00:00','YYYY-MM-DD HH24:MI:SS'),245000,266500,232500,255000,6692472,'005490','POSCO홀딩스');
Insert into KOSPI (RDATE,OPRICE,HPRICE,LPRICE,CPRICE,VOL,TICKER,TNAME) values (to_date('2022-09-30 00:00:00','YYYY-MM-DD HH24:MI:SS'),252500,259500,211000,211000,7406481,'005490','POSCO홀딩스');
Insert into KOSPI (RDATE,OPRICE,HPRICE,LPRICE,CPRICE,VOL,TICKER,TNAME) values (to_date('2022-10-31 00:00:00','YYYY-MM-DD HH24:MI:SS'),215500,258000,215000,249000,7554258,'005490','POSCO홀딩스');
Insert into KOSPI (RDATE,OPRICE,HPRICE,LPRICE,CPRICE,VOL,TICKER,TNAME) values (to_date('2022-11-30 00:00:00','YYYY-MM-DD HH24:MI:SS'),250000,303000,247000,299500,10986070,'005490','POSCO홀딩스');
Insert into KOSPI (RDATE,OPRICE,HPRICE,LPRICE,CPRICE,VOL,TICKER,TNAME) values (to_date('2022-12-31 00:00:00','YYYY-MM-DD HH24:MI:SS'),304500,306500,276000,276500,8156754,'005490','POSCO홀딩스');
Insert into KOSPI (RDATE,OPRICE,HPRICE,LPRICE,CPRICE,VOL,TICKER,TNAME) values (to_date('2023-01-31 00:00:00','YYYY-MM-DD HH24:MI:SS'),277000,315000,265500,300500,7767937,'005490','POSCO홀딩스');
Insert into KOSPI (RDATE,OPRICE,HPRICE,LPRICE,CPRICE,VOL,TICKER,TNAME) values (to_date('2023-02-28 00:00:00','YYYY-MM-DD HH24:MI:SS'),302000,349500,293500,318000,14070434,'005490','POSCO홀딩스');
Insert into KOSPI (RDATE,OPRICE,HPRICE,LPRICE,CPRICE,VOL,TICKER,TNAME) values (to_date('2023-03-31 00:00:00','YYYY-MM-DD HH24:MI:SS'),325500,392000,314500,368000,19258342,'005490','POSCO홀딩스');
Insert into KOSPI (RDATE,OPRICE,HPRICE,LPRICE,CPRICE,VOL,TICKER,TNAME) values (to_date('2023-04-30 00:00:00','YYYY-MM-DD HH24:MI:SS'),385000,436000,358000,377000,43960760,'005490','POSCO홀딩스');
Insert into KOSPI (RDATE,OPRICE,HPRICE,LPRICE,CPRICE,VOL,TICKER,TNAME) values (to_date('2023-05-31 00:00:00','YYYY-MM-DD HH24:MI:SS'),379000,387500,356000,360000,14345086,'005490','POSCO홀딩스');
Insert into KOSPI (RDATE,OPRICE,HPRICE,LPRICE,CPRICE,VOL,TICKER,TNAME) values (to_date('2023-06-30 00:00:00','YYYY-MM-DD HH24:MI:SS'),361000,410500,357000,388000,16961001,'005490','POSCO홀딩스');
Insert into KOSPI (RDATE,OPRICE,HPRICE,LPRICE,CPRICE,VOL,TICKER,TNAME) values (to_date('2022-01-31 00:00:00','YYYY-MM-DD HH24:MI:SS'),79400,79800,71200,73300,280187100,'005930','삼성전자');
Insert into KOSPI (RDATE,OPRICE,HPRICE,LPRICE,CPRICE,VOL,TICKER,TNAME) values (to_date('2022-02-28 00:00:00','YYYY-MM-DD HH24:MI:SS'),74900,75800,71000,72100,233201135,'005930','삼성전자');
Insert into KOSPI (RDATE,OPRICE,HPRICE,LPRICE,CPRICE,VOL,TICKER,TNAME) values (to_date('2022-03-31 00:00:00','YYYY-MM-DD HH24:MI:SS'),72300,73100,68700,69600,307432780,'005930','삼성전자');
Insert into KOSPI (RDATE,OPRICE,HPRICE,LPRICE,CPRICE,VOL,TICKER,TNAME) values (to_date('2022-04-30 00:00:00','YYYY-MM-DD HH24:MI:SS'),69500,69600,64500,67400,309880731,'005930','삼성전자');
Insert into KOSPI (RDATE,OPRICE,HPRICE,LPRICE,CPRICE,VOL,TICKER,TNAME) values (to_date('2022-05-31 00:00:00','YYYY-MM-DD HH24:MI:SS'),66600,68800,64900,67400,310129252,'005930','삼성전자');
Insert into KOSPI (RDATE,OPRICE,HPRICE,LPRICE,CPRICE,VOL,TICKER,TNAME) values (to_date('2022-06-30 00:00:00','YYYY-MM-DD HH24:MI:SS'),66600,67300,56800,57000,428473209,'005930','삼성전자');
Insert into KOSPI (RDATE,OPRICE,HPRICE,LPRICE,CPRICE,VOL,TICKER,TNAME) values (to_date('2022-07-31 00:00:00','YYYY-MM-DD HH24:MI:SS'),56900,62600,55700,61400,301826933,'005930','삼성전자');
Insert into KOSPI (RDATE,OPRICE,HPRICE,LPRICE,CPRICE,VOL,TICKER,TNAME) values (to_date('2022-08-31 00:00:00','YYYY-MM-DD HH24:MI:SS'),61000,61900,58200,59700,251681339,'005930','삼성전자');
Insert into KOSPI (RDATE,OPRICE,HPRICE,LPRICE,CPRICE,VOL,TICKER,TNAME) values (to_date('2022-09-30 00:00:00','YYYY-MM-DD HH24:MI:SS'),58700,58900,51800,53100,288615372,'005930','삼성전자');
Insert into KOSPI (RDATE,OPRICE,HPRICE,LPRICE,CPRICE,VOL,TICKER,TNAME) values (to_date('2022-10-31 00:00:00','YYYY-MM-DD HH24:MI:SS'),55300,60100,54000,59400,326537635,'005930','삼성전자');
Insert into KOSPI (RDATE,OPRICE,HPRICE,LPRICE,CPRICE,VOL,TICKER,TNAME) values (to_date('2022-11-30 00:00:00','YYYY-MM-DD HH24:MI:SS'),59900,63200,58100,62200,290682036,'005930','삼성전자');
Insert into KOSPI (RDATE,OPRICE,HPRICE,LPRICE,CPRICE,VOL,TICKER,TNAME) values (to_date('2022-12-31 00:00:00','YYYY-MM-DD HH24:MI:SS'),63100,63200,55300,55300,234543029,'005930','삼성전자');
Insert into KOSPI (RDATE,OPRICE,HPRICE,LPRICE,CPRICE,VOL,TICKER,TNAME) values (to_date('2023-01-31 00:00:00','YYYY-MM-DD HH24:MI:SS'),55500,65000,54500,61000,304721328,'005930','삼성전자');
Insert into KOSPI (RDATE,OPRICE,HPRICE,LPRICE,CPRICE,VOL,TICKER,TNAME) values (to_date('2023-02-28 00:00:00','YYYY-MM-DD HH24:MI:SS'),62600,64000,60200,60600,259275907,'005930','삼성전자');
Insert into KOSPI (RDATE,OPRICE,HPRICE,LPRICE,CPRICE,VOL,TICKER,TNAME) values (to_date('2023-03-31 00:00:00','YYYY-MM-DD HH24:MI:SS'),60900,64000,59000,64000,273644150,'005930','삼성전자');
Insert into KOSPI (RDATE,OPRICE,HPRICE,LPRICE,CPRICE,VOL,TICKER,TNAME) values (to_date('2023-04-30 00:00:00','YYYY-MM-DD HH24:MI:SS'),64000,66600,62300,65500,291035766,'005930','삼성전자');
Insert into KOSPI (RDATE,OPRICE,HPRICE,LPRICE,CPRICE,VOL,TICKER,TNAME) values (to_date('2023-05-31 00:00:00','YYYY-MM-DD HH24:MI:SS'),66000,72500,63600,71400,269419265,'005930','삼성전자');
Insert into KOSPI (RDATE,OPRICE,HPRICE,LPRICE,CPRICE,VOL,TICKER,TNAME) values (to_date('2023-06-30 00:00:00','YYYY-MM-DD HH24:MI:SS'),70900,73400,70000,72200,265070208,'005930','삼성전자');
Insert into KOSPI (RDATE,OPRICE,HPRICE,LPRICE,CPRICE,VOL,TICKER,TNAME) values (to_date('2022-01-31 00:00:00','YYYY-MM-DD HH24:MI:SS'),242000,278500,199500,216000,15570280,'096770','SK이노베이션');
Insert into KOSPI (RDATE,OPRICE,HPRICE,LPRICE,CPRICE,VOL,TICKER,TNAME) values (to_date('2022-02-28 00:00:00','YYYY-MM-DD HH24:MI:SS'),223000,232000,192500,200500,8821992,'096770','SK이노베이션');
Insert into KOSPI (RDATE,OPRICE,HPRICE,LPRICE,CPRICE,VOL,TICKER,TNAME) values (to_date('2022-03-31 00:00:00','YYYY-MM-DD HH24:MI:SS'),203500,221500,188500,215000,8237602,'096770','SK이노베이션');
Insert into KOSPI (RDATE,OPRICE,HPRICE,LPRICE,CPRICE,VOL,TICKER,TNAME) values (to_date('2022-04-30 00:00:00','YYYY-MM-DD HH24:MI:SS'),213500,225000,199500,205000,7583379,'096770','SK이노베이션');
Insert into KOSPI (RDATE,OPRICE,HPRICE,LPRICE,CPRICE,VOL,TICKER,TNAME) values (to_date('2022-05-31 00:00:00','YYYY-MM-DD HH24:MI:SS'),202000,216500,196000,215500,5641431,'096770','SK이노베이션');
Insert into KOSPI (RDATE,OPRICE,HPRICE,LPRICE,CPRICE,VOL,TICKER,TNAME) values (to_date('2022-06-30 00:00:00','YYYY-MM-DD HH24:MI:SS'),215500,246000,192000,192000,10649198,'096770','SK이노베이션');
Insert into KOSPI (RDATE,OPRICE,HPRICE,LPRICE,CPRICE,VOL,TICKER,TNAME) values (to_date('2022-07-31 00:00:00','YYYY-MM-DD HH24:MI:SS'),191500,193500,158500,187500,8548378,'096770','SK이노베이션');
Insert into KOSPI (RDATE,OPRICE,HPRICE,LPRICE,CPRICE,VOL,TICKER,TNAME) values (to_date('2022-08-31 00:00:00','YYYY-MM-DD HH24:MI:SS'),188500,213500,179500,190000,8181922,'096770','SK이노베이션');
Insert into KOSPI (RDATE,OPRICE,HPRICE,LPRICE,CPRICE,VOL,TICKER,TNAME) values (to_date('2022-09-30 00:00:00','YYYY-MM-DD HH24:MI:SS'),187000,194000,142500,143500,8026950,'096770','SK이노베이션');
Insert into KOSPI (RDATE,OPRICE,HPRICE,LPRICE,CPRICE,VOL,TICKER,TNAME) values (to_date('2022-10-31 00:00:00','YYYY-MM-DD HH24:MI:SS'),148000,176000,147500,173000,8111615,'096770','SK이노베이션');
Insert into KOSPI (RDATE,OPRICE,HPRICE,LPRICE,CPRICE,VOL,TICKER,TNAME) values (to_date('2022-11-30 00:00:00','YYYY-MM-DD HH24:MI:SS'),174500,193000,166000,179000,11765884,'096770','SK이노베이션');
Insert into KOSPI (RDATE,OPRICE,HPRICE,LPRICE,CPRICE,VOL,TICKER,TNAME) values (to_date('2022-12-31 00:00:00','YYYY-MM-DD HH24:MI:SS'),182500,182500,153000,154000,5174674,'096770','SK이노베이션');
Insert into KOSPI (RDATE,OPRICE,HPRICE,LPRICE,CPRICE,VOL,TICKER,TNAME) values (to_date('2023-01-31 00:00:00','YYYY-MM-DD HH24:MI:SS'),155500,170500,144000,162100,6437750,'096770','SK이노베이션');
Insert into KOSPI (RDATE,OPRICE,HPRICE,LPRICE,CPRICE,VOL,TICKER,TNAME) values (to_date('2023-02-28 00:00:00','YYYY-MM-DD HH24:MI:SS'),162300,176000,150000,150100,13097500,'096770','SK이노베이션');
Insert into KOSPI (RDATE,OPRICE,HPRICE,LPRICE,CPRICE,VOL,TICKER,TNAME) values (to_date('2023-03-31 00:00:00','YYYY-MM-DD HH24:MI:SS'),151200,194900,150500,179300,24422877,'096770','SK이노베이션');
Insert into KOSPI (RDATE,OPRICE,HPRICE,LPRICE,CPRICE,VOL,TICKER,TNAME) values (to_date('2023-04-30 00:00:00','YYYY-MM-DD HH24:MI:SS'),181500,209000,171200,173100,19568480,'096770','SK이노베이션');
Insert into KOSPI (RDATE,OPRICE,HPRICE,LPRICE,CPRICE,VOL,TICKER,TNAME) values (to_date('2023-05-31 00:00:00','YYYY-MM-DD HH24:MI:SS'),174500,193400,173500,189100,11424918,'096770','SK이노베이션');
Insert into KOSPI (RDATE,OPRICE,HPRICE,LPRICE,CPRICE,VOL,TICKER,TNAME) values (to_date('2023-06-30 00:00:00','YYYY-MM-DD HH24:MI:SS'),189400,207500,157800,158500,14634689,'096770','SK이노베이션');
Insert into KOSPI (RDATE,OPRICE,HPRICE,LPRICE,CPRICE,VOL,TICKER,TNAME) values (to_date('2022-01-31 00:00:00','YYYY-MM-DD HH24:MI:SS'),191210,192655,141602,145455,20295654,'068270','셀트리온');
Insert into KOSPI (RDATE,OPRICE,HPRICE,LPRICE,CPRICE,VOL,TICKER,TNAME) values (to_date('2022-02-28 00:00:00','YYYY-MM-DD HH24:MI:SS'),147863,159422,144492,153643,8603480,'068270','셀트리온');
Insert into KOSPI (RDATE,OPRICE,HPRICE,LPRICE,CPRICE,VOL,TICKER,TNAME) values (to_date('2022-03-31 00:00:00','YYYY-MM-DD HH24:MI:SS'),153643,182541,153161,165202,16427064,'068270','셀트리온');
Insert into KOSPI (RDATE,OPRICE,HPRICE,LPRICE,CPRICE,VOL,TICKER,TNAME) values (to_date('2022-04-30 00:00:00','YYYY-MM-DD HH24:MI:SS'),163757,171463,149790,169537,7548085,'068270','셀트리온');
Insert into KOSPI (RDATE,OPRICE,HPRICE,LPRICE,CPRICE,VOL,TICKER,TNAME) values (to_date('2022-05-31 00:00:00','YYYY-MM-DD HH24:MI:SS'),168092,169537,133895,154606,9935962,'068270','셀트리온');
Insert into KOSPI (RDATE,OPRICE,HPRICE,LPRICE,CPRICE,VOL,TICKER,TNAME) values (to_date('2022-06-30 00:00:00','YYYY-MM-DD HH24:MI:SS'),154124,177243,140638,171945,10070030,'068270','셀트리온');
Insert into KOSPI (RDATE,OPRICE,HPRICE,LPRICE,CPRICE,VOL,TICKER,TNAME) values (to_date('2022-07-31 00:00:00','YYYY-MM-DD HH24:MI:SS'),173871,185912,167610,183023,8401475,'068270','셀트리온');
Insert into KOSPI (RDATE,OPRICE,HPRICE,LPRICE,CPRICE,VOL,TICKER,TNAME) values (to_date('2022-08-31 00:00:00','YYYY-MM-DD HH24:MI:SS'),183504,207105,175316,182541,9452159,'068270','셀트리온');
Insert into KOSPI (RDATE,OPRICE,HPRICE,LPRICE,CPRICE,VOL,TICKER,TNAME) values (to_date('2022-09-30 00:00:00','YYYY-MM-DD HH24:MI:SS'),181096,182541,157014,169055,7961120,'068270','셀트리온');
Insert into KOSPI (RDATE,OPRICE,HPRICE,LPRICE,CPRICE,VOL,TICKER,TNAME) values (to_date('2022-10-31 00:00:00','YYYY-MM-DD HH24:MI:SS'),171945,186876,156051,184949,7114871,'068270','셀트리온');
Insert into KOSPI (RDATE,OPRICE,HPRICE,LPRICE,CPRICE,VOL,TICKER,TNAME) values (to_date('2022-11-30 00:00:00','YYYY-MM-DD HH24:MI:SS'),183504,186876,165202,169537,7533555,'068270','셀트리온');
Insert into KOSPI (RDATE,OPRICE,HPRICE,LPRICE,CPRICE,VOL,TICKER,TNAME) values (to_date('2022-12-31 00:00:00','YYYY-MM-DD HH24:MI:SS'),172908,177243,159500,160500,6763403,'068270','셀트리온');
Insert into KOSPI (RDATE,OPRICE,HPRICE,LPRICE,CPRICE,VOL,TICKER,TNAME) values (to_date('2023-01-31 00:00:00','YYYY-MM-DD HH24:MI:SS'),161000,172000,156000,161600,5410380,'068270','셀트리온');
Insert into KOSPI (RDATE,OPRICE,HPRICE,LPRICE,CPRICE,VOL,TICKER,TNAME) values (to_date('2023-02-28 00:00:00','YYYY-MM-DD HH24:MI:SS'),161700,172000,144700,145200,9298283,'068270','셀트리온');
Insert into KOSPI (RDATE,OPRICE,HPRICE,LPRICE,CPRICE,VOL,TICKER,TNAME) values (to_date('2023-03-31 00:00:00','YYYY-MM-DD HH24:MI:SS'),144900,160500,142500,149800,13115035,'068270','셀트리온');
Insert into KOSPI (RDATE,OPRICE,HPRICE,LPRICE,CPRICE,VOL,TICKER,TNAME) values (to_date('2023-04-30 00:00:00','YYYY-MM-DD HH24:MI:SS'),151400,184100,149400,160600,12581317,'068270','셀트리온');
Insert into KOSPI (RDATE,OPRICE,HPRICE,LPRICE,CPRICE,VOL,TICKER,TNAME) values (to_date('2023-05-31 00:00:00','YYYY-MM-DD HH24:MI:SS'),160700,180900,153800,171300,8818837,'068270','셀트리온');
Insert into KOSPI (RDATE,OPRICE,HPRICE,LPRICE,CPRICE,VOL,TICKER,TNAME) values (to_date('2023-06-30 00:00:00','YYYY-MM-DD HH24:MI:SS'),171300,177400,149300,152900,10296850,'068270','셀트리온');
Insert into KOSPI (RDATE,OPRICE,HPRICE,LPRICE,CPRICE,VOL,TICKER,TNAME) values (to_date('2022-01-31 00:00:00','YYYY-MM-DD HH24:MI:SS'),113500,117000,82200,85000,67362020,'035720','카카오');
Insert into KOSPI (RDATE,OPRICE,HPRICE,LPRICE,CPRICE,VOL,TICKER,TNAME) values (to_date('2022-02-28 00:00:00','YYYY-MM-DD HH24:MI:SS'),87100,95000,84500,94100,49646154,'035720','카카오');
Insert into KOSPI (RDATE,OPRICE,HPRICE,LPRICE,CPRICE,VOL,TICKER,TNAME) values (to_date('2022-03-31 00:00:00','YYYY-MM-DD HH24:MI:SS'),94400,110000,89600,106500,48471677,'035720','카카오');
Insert into KOSPI (RDATE,OPRICE,HPRICE,LPRICE,CPRICE,VOL,TICKER,TNAME) values (to_date('2022-04-30 00:00:00','YYYY-MM-DD HH24:MI:SS'),105500,108000,87600,89900,31610295,'035720','카카오');
Insert into KOSPI (RDATE,OPRICE,HPRICE,LPRICE,CPRICE,VOL,TICKER,TNAME) values (to_date('2022-05-31 00:00:00','YYYY-MM-DD HH24:MI:SS'),88400,91900,80000,85000,35611165,'035720','카카오');
Insert into KOSPI (RDATE,OPRICE,HPRICE,LPRICE,CPRICE,VOL,TICKER,TNAME) values (to_date('2022-06-30 00:00:00','YYYY-MM-DD HH24:MI:SS'),84000,87400,66700,69900,38118975,'035720','카카오');
Insert into KOSPI (RDATE,OPRICE,HPRICE,LPRICE,CPRICE,VOL,TICKER,TNAME) values (to_date('2022-07-31 00:00:00','YYYY-MM-DD HH24:MI:SS'),70000,75600,66200,74800,30423526,'035720','카카오');
Insert into KOSPI (RDATE,OPRICE,HPRICE,LPRICE,CPRICE,VOL,TICKER,TNAME) values (to_date('2022-08-31 00:00:00','YYYY-MM-DD HH24:MI:SS'),74800,84300,71500,73400,37365973,'035720','카카오');
Insert into KOSPI (RDATE,OPRICE,HPRICE,LPRICE,CPRICE,VOL,TICKER,TNAME) values (to_date('2022-09-30 00:00:00','YYYY-MM-DD HH24:MI:SS'),72300,72500,55000,57100,29609838,'035720','카카오');
Insert into KOSPI (RDATE,OPRICE,HPRICE,LPRICE,CPRICE,VOL,TICKER,TNAME) values (to_date('2022-10-31 00:00:00','YYYY-MM-DD HH24:MI:SS'),57700,58100,46500,50700,64147607,'035720','카카오');
Insert into KOSPI (RDATE,OPRICE,HPRICE,LPRICE,CPRICE,VOL,TICKER,TNAME) values (to_date('2022-11-30 00:00:00','YYYY-MM-DD HH24:MI:SS'),50400,61000,48950,56400,71561732,'035720','카카오');
Insert into KOSPI (RDATE,OPRICE,HPRICE,LPRICE,CPRICE,VOL,TICKER,TNAME) values (to_date('2022-12-31 00:00:00','YYYY-MM-DD HH24:MI:SS'),59200,59700,52700,53100,33393351,'035720','카카오');
Insert into KOSPI (RDATE,OPRICE,HPRICE,LPRICE,CPRICE,VOL,TICKER,TNAME) values (to_date('2023-01-31 00:00:00','YYYY-MM-DD HH24:MI:SS'),53600,65500,51400,61400,43113522,'035720','카카오');
Insert into KOSPI (RDATE,OPRICE,HPRICE,LPRICE,CPRICE,VOL,TICKER,TNAME) values (to_date('2023-02-28 00:00:00','YYYY-MM-DD HH24:MI:SS'),62000,71300,61000,62400,51391880,'035720','카카오');
Insert into KOSPI (RDATE,OPRICE,HPRICE,LPRICE,CPRICE,VOL,TICKER,TNAME) values (to_date('2023-03-31 00:00:00','YYYY-MM-DD HH24:MI:SS'),62200,63800,57500,61100,44325794,'035720','카카오');
Insert into KOSPI (RDATE,OPRICE,HPRICE,LPRICE,CPRICE,VOL,TICKER,TNAME) values (to_date('2023-04-30 00:00:00','YYYY-MM-DD HH24:MI:SS'),61400,61600,55300,58100,33895780,'035720','카카오');
Insert into KOSPI (RDATE,OPRICE,HPRICE,LPRICE,CPRICE,VOL,TICKER,TNAME) values (to_date('2023-05-31 00:00:00','YYYY-MM-DD HH24:MI:SS'),58200,58900,55600,56200,26107371,'035720','카카오');
Insert into KOSPI (RDATE,OPRICE,HPRICE,LPRICE,CPRICE,VOL,TICKER,TNAME) values (to_date('2023-06-30 00:00:00','YYYY-MM-DD HH24:MI:SS'),56300,58000,48400,49100,33124161,'035720','카카오');

[ SQL 문제들 ] : DML

1. 종목 확인

SELECT
    코드 as TICKER,
    종목명 as TNAME
FROM
    KOSPI
GROUP BY
    코드, 종목명;
  • DISTINCT를 쓰거나, GROUP BY를 쓰거나!
SELECT
	DISTINCT 코드 as TICKER, 종목명 as TNAME
FROM
	KOSPI;

[ 결과 ]

TICKER TNAME

096770 SK이노베이션
005490 POSCO홀딩스
068270 셀트리온
035720 카카오
005930 삼성전자
086520 에코프로

2. 투자 기간 몇 달인지 확인하기 ( 1달이 30일일 때 기준 ),

소수점 나오면 버리기

SELECT
    FLOOR(((MAX(날짜) - MIN(날짜))/30)) as  MM
FROM
    KOSPI;

[ 결과 ]

MM

17

3. 각 종목 별 가장 큰 종가와 가장 작은 종가를 내어보라.

TICKER TNAME MAXPRICE MINPRICE

SELECT
    코드 as TICKER,
    종목명 as TNAME,
    MAX(종가) as MAXPRICE,
    MIN(종가) as MINPRICE
FROM
    KOSPI
GROUP BY
    코드, 종목명;

[ 결과 ]

TICKER TNAME MAXPRICE MINPRICE

096770 SK이노베이션 216000 143500
005490 POSCO홀딩스 388000 211000
068270 셀트리온 184949 145200
035720 카카오 106500 49100
005930 삼성전자 73300 53100
086520 에코프로 754000 63331

4. 각 종목별 최근 종가 ( ★★★ 자꾸 헷갈림. )

-- 각 종목별 최근 종가
SELECT
    코드 as TICKER,
    종목명 as TNAME,
    종가
FROM
    KOSPI
WHERE
    (종목명, 날짜) IN (
        SELECT
            종목명,
            MAX(날짜)
        FROM
            KOSPI
        GROUP BY
            종목명
    );
  • 종목명에 해당하는 최근 날짜들을 튜플로 정리해놓고 ( By Group By )
    • 해당 리스트와 원본 테이블을 비교해주었다.

5. 각 종목별 상승, 하락 횟수 ( 중요 )

각 종목별 상승, 하락 횟수
상승 : 시가 < 종가
하락 : 시가 > 종가

TNAME GUBUN CNT
POSCO홀딩스 상승 11

SELECT
    k.TNAME,
    k.GUBUN,
    COUNT(*) as CNT
FROM
    (SELECT
        종목명 as TNAME,
        CASE
            WHEN
                시가 < 종가
            THEN
                '상승'
            WHEN
                시가 > 종가
            THEN
                '하락'
        END as GUBUN
    FROM
        KOSPI) k
GROUP BY
    TNAME, GUBUN
ORDER BY
    TNAME ASC;
  • CASE WHEN 문법으로 ‘상승’과 ‘하락’ 여부를 구분하여 새로운 테이블(뷰)를 구성했다.
  • 인라인 뷰로 한번은 감싸주어야 TNAME, GUBUN으로 그룹화가 가능했다.
    • 왜냐하면, 서브쿼리 내에서 GROUP BY를 하려한다면, GUBUN이라는 칼럼을 사용할 수 없기 때문이다. ( 왜냐하면, GROUP BYSELECT 보다 먼저 실행되기에, SELECTAlias를 참조할 수 없기 때문이다. )
  • UNION으로 구현할 수도 있다. ‘상승’‘하락’을 나누어서 UNION을 통해 합쳐주면 된다.
(SELECT
    종목명 as TNAME,
    '상승'  as GUBUN,
    COUNT(*) as CNT
FROM
    KOSPI
WHERE
    시가 < 종가
GROUP BY
    종목명)
UNION
(SELECT
    종목명 as TNAME,
    '하락'  as GUBUN,
    COUNT(*) as CNT
FROM
    KOSPI
WHERE
    시가 > 종가
GROUP BY
    종목명)
ORDER BY
		TNAME;

8. 카카오 월별 거래량 ( 2022년도 )

SELECT,
    SUM(거래량) as 거래량
FROM
    (SELECT
        TO_CHAR(날짜, 'MM') as,
        거래량
    FROM(
            SELECT
                날짜,
                거래량
            FROM
                KOSPI
            WHERE
                날짜 BETWEEN 
                        TO_DATE('2022/01/01') 
                    AND 
                        TO_DATE('2023/01/01')
            AND
                종목명 = '카카오'))
GROUP BYORDER BYASC;
  • 2022년도를 기준으로 하므로,
    맨 안쪽 서브쿼리에서 2022년도의 카카오의 데이터를 가져왔다.

9. 카카오 월별 거래량 중 최대값

SELECT
    *
FROM(
    SELECT,
        SUM(거래량) as 거래량
    FROM(
        SELECT
            TO_CHAR(날짜, 'MM') as,
            거래량
        FROM
            KOSPI
        WHERE
            날짜 BETWEEN 
                    TO_DATE('2022/01/01') 
                AND 
                    TO_DATE('2023/01/01')
            AND
                종목명 = '카카오')
    GROUP BYORDER BY
        거래량 DESC)
WHERE
    ROWNUM = 1;

10. 카카오 월별 등락율 ( 2022년도 )

— 등락율 = (매도가격 - 매수가격) / 매수가격 * 100

— 등락율 = (종가 - 시가) / 시가 * 100

0개의 댓글