2020년 7월 19일 일요일

오라클, SQL, 칼럼의 값이 유일한지 확인하는 쿼리, 부서별로 JOB의 개수를 세는 쿼리

오라클, SQL, 칼럼의 값이 유일한지 확인하는 쿼리, 부서별로 JOB의 개수를 세는 쿼리

http://ojc.asia/bbs/board.php?bo_table=LecSQLnPlSql&wr_id=630

COUNT, SUM, DECODE, GROUP BY 활용

이번에는 칼럼의 값이 유일한지 확인하는 쿼리문을 생각해 보자.

-- deptno별로 값의 수를 count 후, 최대인것을 골라 0이면 Unique, 아니면 Non Unique를 출력한다.

SQL> select decode(max(count(deptno)),1,'Unique','Non Unique') "Unique ?"

from emp

group by deptno ;

Unique ?

----------

Non Unique

EMP테이블에서 JOB별, DEPTNO별로 급여의 급여를 합계를 아래처럼 구하는 Matrix Report를 생각해 보자.

JOB 10번부서 20번부서 30번부서 40번부서

--------- ---------- ---------- ---------- ----------

ANALYST 6000

CLERK 1300 1900 950

MANAGER 2450 2975 2850

PRESIDENT 5000

SALESMAN 5600

-- 첫번째 칼럼이 job이 므로 먼저 job별로 group by를 하고, 나머지열은 하나씩 sum, decode를 이용해서 만들어 나가면 된다.

SQL> select *

from (

select job,

sum(decode(deptno, 10, sal)) "10번부서",

sum(decode(deptno, 20, sal)) "20번부서",

sum(decode(deptno, 30, sal)) "30번부서",

sum(decode(deptno, 40, sal)) "40번부서"

from emp

group by job

)

order by job ;

JOB 10번부서 20번부서 30번부서 40번부서

--------- ---------- ---------- ---------- ----------

ANALYST 6000

CLERK 1300 1900 950

MANAGER 2450 2975 2850

PRESIDENT 5000

SALESMAN 5600

이번에는 EMP 테이블에서 부서별로 JOB의 개수를 세는 쿼리를 생각해 보자. 이 역시 부서별이니 deptno로 group by를 해야 하며 sum, decode를 이용하여 나머지 job들의 칼럼을 만들어 내야 한다.

SQL> select

deptno "부서코드"

, sum(decode(job, 'CLERK', 1, 0)) Clerk

, sum(decode(job, 'SALESMAN', 1, 0)) Salesman

, sum(decode(job, 'MANAGER', 1, 0)) Manager

, sum(decode(job, 'ANALYST', 1, 0)) Analyst

, sum(decode(job, 'PRESIDENT', 1, 0)) President

FROM emp e

GROUP BY deptno;

부서코드 CLERK SALESMAN MANAGER ANALYST PRESIDENT

---------- ---------- ---------- ---------- ---------- ----------

30 1 4 1 0 0

20 2 0 1 2 0

10 1 0 1 0 1

이번에는 EMP 테이블에서 부서별로 해당 급여 대 인원수를 추출하는 SQL문을 생각해 보자.

부서 $4001-$9999 $3001-$4000 $2001-$3000 $1001-$2000 < $1000

---------- ----------- ----------- ----------- ----------- ----------

30 0 0 1 4 1

20 0 0 3 1 1

10 1 0 1 1 0

SQL> select

deptno "부서",

sum(decode(greatest(SAL,4001), least(SAL,9999), 1, 0)) "$4001-$9999",

sum(decode(greatest(SAL,3001), least(SAL,4000), 1, 0)) "$3001-$4000",

sum(decode(greatest(SAL,2001), least(SAL,3000), 1, 0)) "$2001-$3000",

sum(decode(greatest(SAL,1001), least(SAL, 2000), 1, 0)) "$1001-$2000",

sum(decode(greatest(SAL, 0), least(SAL, 1000), 1, 0)) "< $1000"

from emp

group by deptno;

부서 $4001-$9999 $3001-$4000 $2001-$3000 $1001-$2000 < $1000

---------- ----------- ----------- ----------- ----------- ----------

30 0 0 1 4 1

20 0 0 3 1 1

10 1 0 1 1 0

CASE문을 이용하면 다음과 같다.

SELECT

deptno "부서",

NVL(SUM((case when sal between 4001 and 9999 then 1 end)),0) "$4001-$9999" ,

NVL(SUM((case when sal between 3001 and 4000 then 1 end)),0) "$3001-4000" ,

NVL(SUM((case when sal between 2001 and 3000 then 1 end)),0) "$2001-$3000" ,

NVL(SUM((case when sal between 1001 and 2000 then 1 end)),0) "$1001-$2000" ,

NVL( SUM((case when sal between 1 and 1000 then 1 end)),0) "$1-$1000"

FROM emp

GROUP BY deptno

댓글 없음:

댓글 쓰기

(C#교육동영상)C# ADO.NET 실습 ODP.NET/ODAC 설치 오라클 함수 호출 실습, C#학원, WPF학원, 닷넷학원, 자바학원

  (C#교육동영상)C# ADO.NET 실습  ODP.NET/ODAC 설치  오라클 함수 호출 실습, C#학원, WPF학원, 닷넷학원, 자바학원 https://www.youtube.com/watch?v=qIPU85yAlzc&list=PLxU-i...