SQL#7-グループの利用


1.グループ

  • GROUP BY
  • SELECT 조건컬럼 FROM STUDENT1 GROUP BY(조건컬럼);:前後のカラム名は一致する必要があります.
  • のほとんどは組み込み関数を使用します.
  • 1. COUNT(*)

  • SELECT 조건컬럼, COUNT(*) FROM STUDENT1 GROUP BY(조건컬럼);
  • グループ、クラス学生数(COUNT(*))
    : SELECT STDCLS 반, COUNT(*) FROM STUDENT1 GROUP BY(STDCLS);
  • 2.SUM(列)

  • 合計
  • SELECT 조건컬럼, SUM(합계낼컬럼) 국어합계 FROM STUDENT1 GROUP BY (조건컬럼);
  • 半星、合計(SUM)
    : SELECT STDCLS 반, SUM(SCOREKOR) 국어합계 FROM STUDENT1 GROUP BY (STDCLS);
  • 3.AVG(列)

  • 平均
  • SELECT 조건컬럼, AVG(평균낼컬럼) FROM STUDENT1 GROUP BY(조건컬럼);
  • 班、平均(AVG)
    : SELECT STDCLS 반, AVG(SCOREKOR) 국어평균, SUM(SCOREKOR) 국어합계 FROM STUDENT1 GROUP BY (STDCLS);
  • 4.ROUND(数字、桁数)

  • 四捨五入
  • SELECT 조건컬럼, ROUND(숫자, 자릿수) FROM STUDENT1 GROUP BY(조건컬럼);
  • 半星、平均値(AVG)、四捨五入(ROUND)(数字、桁数)
    : SELECT STDCLS 반, ROUND(AVG(SCOREKOR),1) 국어평균, SUM(SCOREKOR) 국어합계 FROM STUDENT1 GROUP BY (STDCLS);
  • 5.TO CHAR(列、「置換形式」)

  • 文字列
  • に変換
  • TO_CHAR(REGDATE, 'YYYY-MM-DD HH24:MI')
  • 1時間あたりTO_CHAR(REGDATE, 'YYYY-MM-DD HH24)
  • 分解、合計
    : SELECT TO_CHAR(REGDATE, 'YYYY-MM-DD HH24:MI') 시간, COUNT(*) 개수 FROM STUDENT1 GROUP BY (TO_CHAR(REGDATE, 'YYYY-MM-DD HH24:MI'));
  • 完全なコード

    -- 그룹    
    
    -- 학생테이블에 컬럼 추가
    -- STDCLS : VARCHR2(1) 반코드 ('A', 'B', 'C')
    -- SCOREKOR : NUMBER(3)
    -- SCOREENG : NUMBER(3)
    -- SCOREMATH : NUMBER(3)
    -- REGDATE : DATE
    
    ALTER TABLE STUDENT1 ADD STDCLS VARCHAR2(1) DEFAULT 'A';
    ALTER TABLE STUDENT1 ADD SCOREKOR NUMBER(3) DEFAULT 80;
    ALTER TABLE STUDENT1 ADD SCOREENG NUMBER(3) DEFAULT 80;
    ALTER TABLE STUDENT1 ADD SCOREMATH NUMBER(3) DEFAULT 80;
    ALTER TABLE STUDENT1 ADD REGDATE DATE DEFAULT CURRENT_DATE; 
    
    INSERT INTO STUDENT1(STDNO, STDNAME, STDTEL, STDCLS, SCOREKOR, SCOREENG, SCOREMATH, REGDATE)
        VALUES(SEQ_STD_CODE.NEXTVAL, '나다라', '0-0-0', 'B', 50, 45, 70, CURRENT_DATE);
    
    SELECT * FROM STUDENT1;
    
    -- 그룹, 반별 학생수(COUNT(*))
    SELECT STDCLS 반, COUNT(*) FROM STUDENT1 GROUP BY(STDCLS);
    
    -- 반별, 합계(SUM)
    SELECT STDCLS 반, SUM(SCOREKOR) 국어합계 FROM STUDENT1 GROUP BY (STDCLS);
    
    -- 반별, 평균(AVG), 반올림 (ROUND(숫자, 자리수)
    SELECT STDCLS 반, ROUND(AVG(SCOREKOR),1) 국어평균, SUM(SCOREKOR) 국어합계 FROM STUDENT1 GROUP BY (STDCLS);
    
    -- 반별, 평균
    SELECT 
        STDCLS 반, 
        ROUND(AVG(SCOREKOR),1) 국어평균, 
        ROUND(AVG(SCOREENG),1) 영어평균, 
        ROUND(AVG(SCOREMATH),1) 수학평균     
    FROM 
        STUDENT1 
    GROUP BY (STDCLS);
    
    -- 1. 수학점수가 50 이상인 학생들의 반별 평균점수
    -- 내꺼 = 쌤꺼
    SELECT 
        STDCLS 반,
        ROUND(AVG(SCOREMATH),1) 수학평균
    FROM 
        STUDENT1
    WHERE SCOREMATH >=50    
    GROUP BY (STDCLS);    
    
    -- 2. 반별 평균 수학점수가 50점 이상인것
    SELECT 
        STDCLS 반,
        ROUND(AVG(SCOREMATH),1) 수학평균
    FROM 
        STUDENT1    
    GROUP BY (STDCLS) HAVING ROUND(AVG(SCOREMATH),1) >= 50;
    
    -- 3. 분별, 합계
    SELECT
        TO_CHAR(REGDATE, 'YYYY-MM-DD HH24:MI') 시간,
        COUNT(*) 개수
    FROM 
        STUDENT1 
    GROUP BY (TO_CHAR(REGDATE, 'YYYY-MM-DD HH24:MI'));