Jam's story

오라클 days06 본문

Java

오라클 days06

애플쩀 2022. 4. 11. 22:17
-- SCOTT 계정 접속 -- 

--9:40 까지 문제 풀고
--9:41 수업시작~
-----------------------------------------------------------------------------------
1. EMP 테이블의 사원수를 조회하는 쿼리 작성.
    집계함수 / 그룹함수 / 복수행 함수
    COUNT(), SUM(), AVG()
    MAX(), MIN()
    STDDEV() 표준편차, VARIANCE() 분산
    
-- *** ORA-00937: not a single-group group function    
SELECT COUNT(*) 사원수  -- 12명    NULL 값도 포함한 레코드(행) 갯수를 카운팅하겠다.
       -- , COMM
       --, COUNT( COMM ) -- 4   *** 주의할 점) NULL  값을 제외한 ***
       --, SUM( sal + NVL( comm, 0 ) ) total_pay  -- 총급여합
       --, SUM( sal + NVL( comm, 0 ) )/COUNT(*)   --평균급여
       --, AVG( sal + NVL( comm, 0 ) ) avg_pay
       , MAX( sal + NVL( comm, 0 ) ) max_pay -- 최고급여액
       , MIN( sal + NVL( comm, 0 ) ) mix_pay -- 최저급여액
FROM emp;    

 문제)  10:06 수업 시작~ 
      emp 테이블에서 최고급여액을 받는 사원의 정보를 출력(조회)
      ( deptno, ename, job, hiredate 등등 )
SELECT MAX( sal + NVL(comm, 0) )   max_pay 
FROM emp;

SELECT *
FROM emp
WHERE sal + NVL(comm, 0) = ( SELECT MAX( sal + NVL(comm, 0) )   max_pay FROM emp);

WHERE  sal + NVL(comm, 0) = 5000;

문제) emp 테이블에서 최저급여액 받는 사원의 정보 조회.

SELECT MIN( sal + NVL(comm, 0)  ) min_pay
FROM emp;

SELECT *
FROM emp
WHERE sal + NVL(comm, 0) = ( SELECT MIN( sal + NVL(comm, 0) )   max_pay FROM emp);

문제) emp 테이블에서 최고, 최저 급여를 받는 사원의 정보를 조회(출력)
-- 1. 
SELECT *
FROM emp
WHERE sal + NVL(comm, 0) = ( SELECT MIN( sal + NVL(comm, 0) )   max_pay FROM emp)
UNION
SELECT *
FROM emp
WHERE sal + NVL(comm, 0) = ( SELECT MAX( sal + NVL(comm, 0) )   max_pay FROM emp);
-- 2. 
SELECT *
FROM emp
WHERE sal + NVL(comm, 0) = ( SELECT MIN( sal + NVL(comm, 0) )   max_pay FROM emp)
      OR
     sal + NVL(comm, 0) = ( SELECT MAX( sal + NVL(comm, 0) )   max_pay FROM emp);
-- 3.  IN ( LIST ) 

SELECT *
FROM emp
WHERE sal + NVL(comm, 0) IN ( ( SELECT MIN( sal + NVL(comm, 0) )   max_pay FROM emp)
                            , ( SELECT MAX( sal + NVL(comm, 0) )   max_pay FROM emp) );
                            
-- 주의( 기억) 
SELECT *
FROM emp
WHERE sal + NVL(comm, 0 )
         IN (SELECT MIN( sal + NVL(comm, 0) )  , MAX( sal + NVL(comm, 0) ) FROM emp );
WHERE sal + NVL(comm, 0) IN ( ( SELECT MIN( sal + NVL(comm, 0) )  , ( SELECT MAX( sal + NVL(comm, 0) )   FROM emp) );


SELECT MIN( sal + NVL(comm, 0) ) 
     , MAX( sal + NVL(comm, 0) )  
FROM emp

-- 최고급여자, 최저급여자
SELECT *
FROM emp
WHERE  sal + NVL(comm, 0) <= ALL ( SELECT sal+NVL(comm, 0) FROM emp );
WHERE  sal + NVL(comm, 0) >= ALL ( SELECT sal+NVL(comm, 0) FROM emp );
800
1900
1750
2975
2650
2850
2450
5000
1500
950
3000
1300


SELECT *
FROM emp
-- WHERE 조건절의 서브쿼리의 결과가 존재한다면 true 반환
WHERE EXISTS ( SELECT DISTINCT mgr FROM emp WHERE mgr IS NOT NULL );
WHERE EXISTS( SELECT deptno FROM dept );

2. 현재 시스템의   날짜를 출력하는 쿼리 작성
SELECT SYSDATE   --현재 시스템의 날짜/시간
  , CURRENT_DATE -- 세션의 날짜/시간
  , CURRENT_TIMESTAMP --            + 나노초 ( 확장 )
FROM dual;

3. SQL 집합 연산자의 종류와 설명을 하세요
   UNION
   UNION ALL
   INTERSECT
   MINUS
   
   주의사항 ) 컬럼 자료형, 컬럼 갯수 동일.


4. 함수 설명
  ㄱ. 반올림 함수를 선언형식을 적고 설명하세요             ROUND( , ??)
  ㄴ. 절삭(내림) 함수를 선언형식을 적고 설명하세요.        TRUNC(  , 0) == FLOOR()
  ㄷ. 절상(올림) 함수를 선언형식을 적고 설명하세요.        CEIL()
  
5. 게시판에서 총 게시글 수가 : 65 개 이고  한 페이지에 : 15개의 게시글 출력할 때
    총 페이지 수를 계산하는 쿼리 작성.
SELECT CEIL(65/15) 총페이지수    
FROM dual;    
    
6. emp 테이블에서 사원들의 평균 급여보다 많은 급여를 받으면 1
                                     적은 급여를 받으면 -1
                                     같으면           0 
  을 출력하는 쿼리 작성.
  
  -- PL/SQL
  SELECT t.ename, t.pay, t.avg_pay
--       , if( t.pay == t.avg_pay)   0
--          else if(    >                1
--          else                           -1
        , SIGN(  t.pay  - t.avg_pay  ) 
  FROM (
              SELECT ename, sal + NVL(comm, 0) pay
               --, AVG X
                 , ( SELECT  FLOOR(  AVG( sal + NVL(comm, 0) ))  FROM emp ) avg_pay
              FROM emp
  ) t;

7. insa테이블에서 80년대( 80년~89년생 )에 출생한 사원들만 조회하는 쿼리를 작성
  ㄱ. LIKE 사용
  WHERE ssn LIKE '8%'  -- 와일드카드  %  _
  ㄴ. REGEXP_LIKE 사용
  WHERE REGEXP_LIKE( ssn, '^8' );
  ㄷ. BETWEEN ~ AND 사용   
  WHERE SUBSTR( ssn, 0, 2) BETWEEN 80 AND 89;
  
8. insa 테이블에서 주민등록번호를 123456-1******  형식으로 출력하세요 . ( LPAD, RPAD 함수 사용  )
[실행결과]
홍길동	770423-1022432	770423-1******
이순신	800423-1544236	800423-1******
이순애	770922-2312547	770922-2******

     SUSTR( ssn, 0, 8 ) || '******')
     SELECT 
            RPAD( SUBSTR( ssn, 0, 8 ) , 14, '*')
     FrOM insa;

8-2. emp 테이블에서 30번 부서만 PAY를 계산 후 막대그래프를 아래와 같이 그리는 쿼리 작성
   ( 필요한 부분은 결과 분석하세요~    PAY가 100 단위당 # 한개 , 반올림처리 )
[실행결과]
DEPTNO ENAME PAY BAR_LENGTH      
---------- ---------- ---------- ----------
30	BLAKE	2850	29	 #############################
30	MARTIN	2650	27	 ###########################
30	ALLEN	1900	19	 ###################
30	WARD	1750	18	 ##################
30	TURNER	1500	15	 ###############
30	JAMES	950	    10	 ##########

SELECT deptno, ename, sal + NVL(comm,0) pay
        , ROUND( sal + NVL(comm,0), -2  )/100 bar_length
        , RPAD ( ' ', ROUND( sal + NVL(comm,0), -2  )/100 + 1 , '#' )
FROM emp
WHERE deptno = 30;

8-3. insa 테이블에서  주민번호를 아래와 같이 '-' 문자를 제거해서 출력
[실행결과]
NAME    SSN             SSN_2
홍길동	770423-1022432	7704231022432
이순신	800423-1544236	8004231544236
이순애	770922-2312547	7709222312547

SELECT ssn
   , REPLACE( ssn, '-', '')
   , INSTR( ssn, '-')
   , SUBSTR( ssn, 0, 6) || SUBSTR( ssn, -7 )
FROM insa;

9. emp 테이블에서 각 사원의 근무일수, [ 근무 개월수, 근무 년수 ]를 출력하세요.

날짜형 - 날짜형 = 일수
날짜형 + 숫자 = 일(숫자)이 더해진 날짜형
날짜형 - 숫자 =             빼진 날짜형
날자형 + 숫자/24 = 시간이 더해진 날짜형
날자형 - 숫자/24 = 시간이 빼진 날짜형

-- 근무일수 / 365 = 근무년수  + 윤년

-- 11:11 수업시작~~
SELECT empno, ename, hiredate        
            , CEIL(  ABS(hiredate - SYSDATE) ) 근무일수
FROM emp;

-- MONTHS_BETWEN() 함수 : 날짜, 날짜 사이의 개월수 리턴하는 함수
-- ORA-00904: "MONTHS_BETWEN": invalid identifier
SELECT  ROUND(  ABS( MONTHS_BETWEEN(hiredate , SYSDATE) ) ,2  )    근무개월수
      , ROUND( ABS( MONTHS_BETWEEN(hiredate , SYSDATE) ) / 12 , 2) 근무년수
FROM emp;


10. 개강일로부터 오늘날짜까지의 수업일수 ?   -- 토/일/공유일
( 개강일 : 2022.2.15 )

--            날짜형 - 날짜형 = 일수
-- ORA-00932: inconsistent datatypes: expected CHAR got DATE
--            불일치 자료형                      char     date
-- 오라클    '문자열'   '날짜형'
--  '2022.02.15' 날짜형이 아닌 문자열로 처리
--  문자열 - 날짜형   오류가 발생한 것.
--  문자열을 날짜형 형변환 ? 
--  C#   이름을 키보드로 부터 입력 화면(콘솔) 출력 ?
--         표준 입력              표준출력
-- 파이썬

-- TO_DATE() 함수로 형변환
-- 문자열( varchar2 , nvarchar2,  char , nchar ) -> 날짜형으로 형변환하는 함수
【형식】
     TO_DATE( char [,'fmt' [,'nlsparam']])
     
     
SELECT  TO_DATE( '2022.02.15' ) - SYSDATE
      -- ORA-01843: not a valid month
     ,  TO_DATE( '02/15/2022' , 'MM/DD/YYYY' ) - SYSDATE
FROM dual;


10-2.  오늘부터 수료일까지 남은 일수 ?  
( 수료일 : 2022.7.29 ) 

SELECT   CEIL( TO_DATE('2022.7.29') - SYSDATE )
FROM dual;

10-3. emp 테이블에서 각 사원의 입사일을 기준으로 100일 후 날짜, 10일전 날짜, 1시간 후 날짜, 3개월 전 날짜 출력

SMITH	80/12/17	81/03/27	80/12/07	80/12/17	81/03/17	80/09/17
ALLEN	81/02/20	81/05/31	81/02/10	81/02/20	81/05/20	80/11/20
WARD	81/02/22	81/06/02	81/02/12	81/02/22	81/05/22	80/11/22

SELECT ename, hiredate
         , hiredate + 100
         , hiredate - 10
         , hiredate + 1/24
         , ADD_MONTHS( hiredate, 3) -- 3개월 후   ADD_MONTHS(개월수)
         , ADD_MONTHS( hiredate, - 3 ) -- 3개월 전
FROM emp;

【형식】
    ADD_MONTHS(date, month)


-- MONTHS_BETWEEN() 개월차

SELECT t.f , t.s
       , MONTHS_BETWEEN( t.f, t.s )  -- 1.03225806451612903225806451612903225806
       , 1/31                        --   0.0322580645161290322580645161290322580645
FROM (
        SELECT TO_DATE('02-02-2022', 'MM-DD-YYYY')    f
              , TO_DATE('01-01-2022', 'MM-DD-YYYY')   s
        FROM dual
        ) t;

-- ADD_MONTHS() 함수
SELECT  ADD_MONTHS(TO_DATE('02-01-2022', 'MM-DD-YYYY'),  1)
       , ADD_MONTHS(TO_DATE('02-28-2022', 'MM-DD-YYYY'),  1)  -- 3-31
       , ADD_MONTHS(TO_DATE('02-27-2022', 'MM-DD-YYYY'),  1)  -- 3-27
FROM dual;

--  LAST_DAY() 함수는 특정날짜가 속한 달(월)의 가장 마지막 날짜를 반환
--  년/월 /                "일(날짜)"만 얻어오고 싶다. 
SELECT  LAST_DAY( SYSDATE )
      , TO_CHAR( LAST_DAY( SYSDATE ), 'DD')
FROM dual;
    
    
  -- 돌아오는 수요일은 휴강입니다. / 다음 주 금욜일은 휴강입니다. 
 -- NEXT_DAY() 함수 : 명시된 요일이 돌아오는 [가장 최근의 날짜]를 리턴하는 함수

SELECT SYSDATE
    -- 1(일) 2(월) ~ 7(토)
   ,  TO_CHAR( SYSDATE, 'D' ) ,  TO_CHAR( SYSDATE, 'DY' ),  TO_CHAR( SYSDATE, 'DAY' )
   , NEXT_DAY( SYSDATE, '금요일')
   , NEXT_DAY( SYSDATE, '월요일')
FROM dual;
 
11. function 설명
 ㄱ. ASCII()
 ㄴ. CHR()
 ㄷ. GREATEST()
 ㄹ. LEAST()
 ㅁ. UPPER()
 ㅂ. LOWER()
 ㅅ. LENGTH()
 ㅇ. SUBSTR()
 ㅈ. INSTR()
 
 SELECT ASCII('가'), ASCII('A')
       , CHR(15380608) , CHR(65)
       , GREATEST( 1,2,3,4,5), LEAST( 1,2,3,4,5)
       , LENGTH('abc')
       , INSTR( 'kenik', 'e')
 FROm dual;
 
 -- *****  날짜 절삭하는 것 이해(암기)
12. SELECT TRUNC( SYSDATE, 'YEAR' ) -- 2022/01/01
      , TRUNC( SYSDATE, 'MONTH' )     -- 2022/04/01
      , TRUNC( SYSDATE  )    -- 2022/04/11 00:00:00
    FROM dual;
    위의 쿼리의 결과를 적으세요 . 
    
    --                  2022/04/11 12:00:06
    SELECT  TO_CHAR(  SYSDATE , 'YYYY/MM/DD HH24:MI:SS' )
    FROM dual;
-----------------------------------------------------------------------------------    

-- 12:13 수업시작~
-- 문제) 이번 달 몇일 남았나요 ? 
SELECT SYSDATE
           , LAST_DAY( SYSDATE)
           -- , 날짜 - 날짜 = 일수
           , LAST_DAY( SYSDATE) - SYSDATE
FROM dual;

-- 오라클 형변환 함수 --
1. TO_NUMBER()  : 문자 -> 숫자 형변환
2. TO_DATE()
3. TO_CHAR()   : 숫자,날짜 -> 문자 형변환

SELECT TO_NUMBER( '10' )  -- 왼쪽 정렬 
       , 10  -- 오른쪽 정렬
       , TO_NUMBER( '10' ) + 10  -- '10' + 10   자동으로(암시적으로)  문자 -> 숫자 변환된다. 
FROM dual;
'10' -> 10 변환

-- insa테이블에서 남자 출력
SELECT *
FROM insa
-- WHERE    '2' = 1;  -- 암시적으로 형변환
WHERE TO_NUMBER( SUBSTR( ssn, -7, 1)) =  1; -- '1' 문자
-- MOD( TO_NUMBER( SUBSTR( ssn, -7, 1) ), 2 )


-- TO_DATE() 숫자,문자 -> 날짜
SELECT  TO_DATE( '2022.2.15' )
     , TO_DATE( '02/15/2022' , 'MM/DD/YYYY' )
     , TO_DATE( '2022' , 'YYYY' )  -- 22/04/01
     -- 2022 년도만 있는 문자열을 TO_DATE() 함수로 날짜로 변환하면 월은 해당월(4), 일( 1) 설정
     , TO_DATE('2022.03', 'YYYY.MM') -- 일( 1 ) 설정
     , TO_DATE( '20', 'DD'  ) -- 22/04/20
FROM dual;


SELECT SYSDATE today
--        , TO_CHAR( SYSDATE, 'YYYY' )  년도  -- 날짜 ->  문자열 '2022' 년도만 가져옴.
--        , TO_CHAR( SYSDATE, 'YY' ) 
--        , TO_CHAR( SYSDATE, 'MM' ) 월
--        , TO_CHAR( SYSDATE, 'DD' ) 일
--        , TO_CHAR( SYSDATE, 'HH' ) 시간
--        , TO_CHAR( SYSDATE, 'HH24' ) 시간
--        , TO_CHAR( SYSDATE, 'MI' ) 분
--        , TO_CHAR( SYSDATE, 'SS' ) 초
--        , TO_CHAR( SYSDATE, 'D' ) 요일  -- 일(1) ~ 토(7)
--        , TO_CHAR( SYSDATE, 'DY' ) 요일
--        , TO_CHAR( SYSDATE, 'DAY' ) 요일
--        , TO_CHAR( SYSDATE, 'CC' ) -- 21세기
--          , TO_CHAR( SYSDATE, 'Q' )  -- 2   (4월~6월)
--    , TO_CHAR( SYSDATE, 'WW' )  -- 15  년 중에 몇 번째 주
--    , TO_CHAR( SYSDATE, 'IW' )  -- 15  1년 중에 몇 번째 주
--    , TO_CHAR( SYSDATE, 'W' )    -- 2 월 중에 몇 번째 주
    , TO_CHAR( SYSDATE, 'TS' )    -- 오후 12:39:24
FROM dual;

-- 문제) 
-- SYSDATE -> TO_CHAR() 함수를 사용해서   '2022년 4월 11일 오후 12:40:12' 출력


SELECT SYSDATE
, TO_CHAR(SYSDATE, 'YYYY') || '년 ' || TO_CHAR(SYSDATE, 'MM') || '월 ' || TO_CHAR(SYSDATE, 'DD') || '일 ' || TO_CHAR(SYSDATE, 'TS') 날짜시간
, TO_CHAR(SYSDATE, 'YYYY"년"MM"월"DD"일" TS' )
FROM dual;

-- 2022/04/11 오후 12:47:05

--      TO_CHAR( DATE )
-- **** TO_CHAR( NUMBER ) ****

SELECT 1234567
 -- 3자리마다 콤마 찍은 문자열로 변환    Java SimpleDateForamt sdf 
   , TO_CHAR( 1234567 , '9,999,999' )  -- ######
   , TO_CHAR( 1234567 , 'L9,999,999.99' )  -- ######  L 통화기호
   , TO_CHAR( 12 , '0999' )  -- 0012
FROM dual;

--
SELECT ename, TO_CHAR( sal + NVL(comm, 0 ) ,  'L9,999.00' ) pay
FROM emp;
-- 
SELECT name,  TO_CHAR( basicpay + sudang , 'L9,999,999' ) pay
FROM insa;

-- 문제) emp 테이블에서 각 사원의 입사일자를 기준으로 10년 5개월 20일째 되는 날은 ? 
SELECT ename, hiredate
     , ADD_MONTHS(  hiredate + 20, 10 * 12 + 5 )
FROM emp;

-- 문제)   문자열 '2021년 12월 23일' -> 날짜형으로 변환
--                   TO_DATE( 문자열 , 'fmt' )
--    ORA-01821: date format not recognized             /  .  ,
SELECT TO_DATE( '2021년 12월 23일' , 'YYYY"년" MM"월" DD"일"' )
FROM dual;

-- 문제)  insa 테이블에서 ssn 주민등록번호를 통해서  생일을 얻어오고
--       오늘을 기준으로 생일 지났다면 -1
--                                  0
--                     생일 지나지 않았다면 1
--       출력하는 쿼리 작성하자. 

-- 설문조사
SELECT name, ssn
      , TO_CHAR(   TO_DATE(  SUBSTR( ssn, 3, 4 ) , 'MMDD' ) , 'YYY/MM/DD HH24:MI:SS' )
      , TO_CHAR(   TRUNC( SYSDATE ) , 'YYY/MM/DD HH24:MI:SS' )
      , SIGN(   TO_DATE(  SUBSTR( ssn, 3, 4 ) , 'MMDD' ) - TRUNC( SYSDATE ) ) 
FROM insa; 


-- COALESCE () 값을 순차적으로 체크해서 NULL이 아닌 값을 반환하는 함수

형식】
        COALESCE(expr[,expr,expr,expr,expr,expr,expr,...])
--
SELECT ename, sal , comm
    ,  sal + NVL( comm, 0)    pay
    ,  sal + NVL2( comm, comm, 0) pay  -- 첫번째 값이 널이 아니면 두번째 값, 널이면 세번째값이 반환.
    ,  sal + COALESCE(comm, 0 ) pay
    , COALESCE(  sal + comm, sal , 0 ) pay
FROM emp;

-- ***** DECODE() 함수 *****
-- 1. 프로그램 언어( 자바)의 if문 
--     3.  if(  ==  ) 비교연산자     = 연산자만 사용가능.
-- 2. FROM 절에서만 사용할 수 없다.  X
-- 4. DECODE() 함수의 확장함수가 CASE() 함수이다. 
-- 5.  PL/SQL 에서 사용할 목적으로 만든 오라클 함수이다. 

-- 자바 --
int x = 10;
if( x == 11){
   return C;
}
--> DECODE(x,11,C);

if( x == 10){
     RETURN A
}else{
    RETURN B
}
--> DECODE( X, 10, A, B )

if(x == 1){
        A 
}else if( x == 10){
        B  
}else if( x == 12){
        C
}else if( x == 14){
        D 
}else{
        E
}
--> DECODE( x, 1, A, 10, B, 12, C, 14, D, E  )

-- 3:05 수업 시작~

--  문제)  insa 테이블에서  ssn 주민등록번호-> 생일을 얻어와서
--        생일 지났으면 1,   0 , 생일 지나지 않았으면 -1 출력.
--                   '생일 후', '오늘 생일', '생일 전'

/*
if( 생일 > 오늘 )   생일 후                        SIGN()  1 -1 0
else if( 생일 < 오늘 ) 생일 전
else    오늘 생일
*/
-- DECODE()를 사용하려면   <  > 비교 연산자 X ,                = 비교연산자만 사용

SELECT name, ssn
--       , SUBSTR( ssn, 3, 4)

--                   -1(생일전)  1(생일후) 0(오늘생일)
       ,  SIGN(  TRUNC( SYSDATE ) -  TO_DATE( SUBSTR( ssn, 3, 4) , 'MMDD' )  ) 
       
       , DECODE( SIGN(  TRUNC( SYSDATE ) -  TO_DATE( SUBSTR( ssn, 3, 4) , 'MMDD' )  ) 
                , -1 , '생일 전'
                , 1  , '생일 후'
                , '오늘 생일'  )
FROM insa;

-- 문제) insa 테이블에서 ssn을 가지고 '남자'/'여자'    라고 성별을 출력
--       (   DECODE ()  사용  )
-- 3:23 풀이

SELECT name, ssn
     , SUBSTR( ssn, -7, 1)  --  남자 1,3,5,7,9
     , DECODE(SUBSTR( ssn, -7, 1), 1 , '남자'
                                 , 3 ,  '남자'
                                 , 5 , '남자'
                                 , 7 , '남자'
                                 , 9 , '남자'
                                 , '여자')
    , DECODE( MOD( SUBSTR( ssn, -7, 1) , 2), 1, '남자', '여자') gender                              
FROM insa; 


-- 문제) insa테이블에서 남자 사원수, 여자 사원수 몇명인지 출력(조회)

SELECT '남자 사원수' "성별" , COUNT(*) "사원수"
FROM insa
WHERE    MOD( SUBSTR(ssn, -7, 1) , 2 ) = 1 
UNION
SELECT '여자 사원수' , COUNT(*)  
FROM insa
WHERE    MOD( SUBSTR(ssn, -7, 1) , 2 ) = 0 
UNION
SELECT '총 사원수' , COUNT(*)  
FROM insa;

-----------------------------
SELECT COUNT(*) 총사원수
      , COUNT(  DECODE(   MOD( SUBSTR(ssn, -7, 1) , 2 ) , 1 , '남자' ) ) 남자_사원수
      , COUNT(  DECODE(   MOD( SUBSTR(ssn, -7, 1) , 2 ) , 0 , '여자' ) ) 여자_사원수
FROM insa;

-- 아직 설명 X -- 
-- 여자  null
-- *****  ORA-00937: not a single-group group function ********
SELECT COUNT( * )
       , COUNT(  DECODE(  MOD( SUBSTR(ssn, -7, 1) , 2 ) , 1 ,'XXXXXXXX' ) ) gender
       , COUNT(  DECODE(  MOD( SUBSTR(ssn, -7, 1) , 2 ) , 0 ,'XXXXXXXX' ) ) gender
FROM insa;

-- 문제) emp 테이블에서  총사원수, 10번, 20번, 30번, 40번 사원수를 출력(조회)
SELECT COUNT(*)
FROM emp
UNION ALL
SELECT COUNT(*)
FROM emp
WHERE deptno =10
UNION ALL
SELECT COUNT(*)
FROM emp
WHERE deptno = 20
UNION ALL
SELECT COUNT(*)
FROM emp
WHERE deptno =30
UNION ALL
SELECT COUNT(*)
FROM emp
WHERE deptno =40;
--
SELECT COUNT(*) 총사원수
, COUNT( DECODE( deptno, 10, '10' ) ) 부서원10번
, COUNT( DECODE( deptno, 20, '10' ) ) 부서원20번
, COUNT( DECODE( deptno, 30, '10' ) ) 부서원30번
, COUNT( DECODE( deptno, 40, '10' ) ) 부서원40번
FROM emp;

-- 4:05 수업 시작~!

 

'Java' 카테고리의 다른 글

오라클 days08  (0) 2022.04.14
[오라클 ] days0  (0) 2022.04.07
[오라클]days03  (0) 2022.04.06
days02 오라클  (0) 2022.04.06
순서도 그리기  (0) 2022.04.02
Comments