IT 프로그래밍/ORACLE2014. 1. 26. 21:40

이번에는 오라클 group by 절에 대해서 알아보겠습니다.

 

글 읽기 전에 손가락 한번 꾸~욱 눌러주시면 감사하겠습니다.^^

 

 

 

어떤 컬럼 값을 기준으로 그룹함수를 적용해 줄지 기술해 주어야 할 경우에는 select 문에 group by 절을 추가하되 group by 절 뒤에 해당 컬럼을 기술합니다.

 

그룹 함수는 테이블에 아무리 행이 많아도 단 한 개의 결과값만을 산출합니다. 그러나 직원 중 가장 높은 급여값을 구하는 것이 아닌, 부서별 가장 높은 급여값을 구하고 싶을 때가 있습니다. 즉, 최대값이나 최소값, 합계, 평균 등을 어떤 컬럼을 기준으로 보고자 하는 경우입니다.

 

이때는 그룹 함수를 쓰되 어떤 컬럼값을 기준으로 그룹 함수를 적용할지 기술해야 합니다.

 

group by 절 뒤에 해당 컬럼을 기술하면 됩니다. 형식은 다음과 같습니다.

 

[형식]

select 컬럼명, 그룹 함수

from 테이블명

where 조건(연산자)

group by 컬럼명;

 

합계, 평균, 최대값이나 최소값 등을 어떤 컬럼을 기준으로 그 컬럼의 값을 개별적으로 보고자 할 때 group by 절 뒤에 해당 컬럼을 기술하면 됩니다. group by절을 사용할 때 주의할 점은 group by절 다음에는 컬럼의 별칭은 사용할 수 없고, 반드시 기존에 있는 컬럼명을 기술해야 한다는 점입니다.

 

사원 테이블을 부서 번호로 그룹 지어 보겠습니다.

 

select deptno from emp group by deptno;

 

 

 

사원 테이블을 부서 번호로 그룹 짓기 위해서 group by절 다음에 부서 번호(deptno)를 기술하였습니다. 위 결과를 보면 사원들은 3개(10번, 20번, 30번) 중의 하나에 소속되어 있는 것을 알 수 있습니다.

 

사원 테이블에서 부서별로 평균 급여를 구하려면 우선 전체 사원을 소속 부서별로 그룹 지어 놓아야 합니다.

 

다음은 소속 부서별 평균 급여를 구하는 예제입니다.

 

select avg(sal) from emp group by deptno;

 

 

 

 

현재 직원들이 속한 부서는 10, 20, 30번부서 단 세 곳이므로 각각 10번, 20번, 30번 부서별 평균이 산출됩니다. 이대로 실행하면 의미 있는 정보가 산출이 될까요? 위의 결과값은 분명 3개 부서의 평균값, 3개의 로우가 산출됩니다. 하지만 각 평균 급여는 어느 부서의 평균값인지의 정보가 결여되어 있어 의미 있는 정보라고 하기는 어렵습니다.

 

어떤 부서의 평균인지를 알아보기 위해 아래와 같이 부서 번호인 deptno도 select절에 함께 기술합니다.

 

select deptno, avg(sal) from emp group by deptno;

 

 

 

 

그룹 함수를 적용하지 않은 단순 컬럼은 select 리스트에 함께 사용할 수 없습니다. 이유는 개수 문제로 매치가 불가능하기 때문입니다.

 

쉽게 예제로 설명을 드리겠습니다.

 

select deptno, ename, avg(sal) from emp group by deptno;

 

 

 

오류가 발생하게 됩니다.

 

그 이유는 deptno, ename, avg(sal)의 컬럼의 산출값이 틀리기 때문입니다.

 

그룹함수 사용 시 group by 절로 묶이지 않은 단순 컬럼은 select 리스트에 사용할 수 없고, 사용시 에러가 발생하므로 주의를 하셔야 합니다.

 

쉽게 설명을 한다고 적었는데 이해가 되셨는가요?

 

궁금하신점은 댓글에 남겨주세요~^^

 

 

Posted by 정윤문경아빠
IT 프로그래밍/ORACLE2014. 1. 26. 20:38

이번에는 그룹함수에 대해서 알아보겠습니다.

 

글 읽으시기 전에 손가락 한번 꾸~욱 눌러주시면 감사하겠습니다.^^

 

 

그룹 함수는 하나 이상의 행을 그룹으로 묶어 연산하여 총합, 평균 등을 하나의 결과로 나타냅니다.

 

우선 예제를 한번 보도록 하겠습니다.

 

select deptno, round(sal, 3) from emp;

 

결과는 다음과 같습니다.

 

 

 

 

위 결과를 보면 각 행에 대해서 함수가 적용되기 때문에 출력 결과가 함수를 적용하기 전과 동일하게 4개의 row로 구해집니다. 이러한 함수를 단일행 함수라고 하며 단일행 함수는 각 행에 대해서 함수의 결과가 구해지기 때문에 결과가 여러 개의 row로 구해집니다.

 

이번에는 그룹 함수를 이용해서 사원의 총 급여를 구해 보겠습니다.

 

select sum(sal) from emp;

 

 

 

 

그룹 함수의 결과는 사원이 총 4명인데도 결과는 하나의 행으로 출력됩니다.

 

다음은 그룹 함수의 종류를 정리한 표입니다.

 

 

 구분 

 설명 

 SUM 

 그룹의 누적 합계를 반환합니다. 

 AVG 

 그룹의 평균을 반환합니다. 

 COUNT 

 그룹의 총 개수를 반환합니다. 

 MAX 

 그룹의 최대값을 반환합니다. 

 MIN 

 그룹의 최소값을 반환합니다. 

 STDDEV 

 그룹의 표준편차를 반환합니다. 

 VARIANCE 

 그룹의 분산을 반환합니다. 

 

다음은 간단한 예제입니다.

 

평균 구하는 AVG 함수

select avg(sal) from emp;

 

최대값, 최소값 구하는 함수

select max(sal), min(sal) from emp;

 

row 개수 구하는 함수(count 함수는 null값에 대한 개수를 세지 않습니다.)

select count(comm) from emp;

 

크게 어려우신 부분은 없을듯 합니다.

 

다음 포스팅은 group by 절에 대해서 알아보겠습니다.

 

궁금하신 점은 댓글 남겨주세요~^^

 

 

Posted by 정윤문경아빠
IT 프로그래밍/JSP2014. 1. 26. 02:32

이번에는 JSP 에서 날짜 관련해서 알아보겠습니다.


글 읽기 전에 손가락을 꾸~욱 눌러주시면 감사하겠습니다.^^



첫번째로 오늘 날짜 알아내는 방법에 대해서 알아보겠습니다.


자바스크립트의 Date 내장 객체를 사용하면 오늘의 날짜를 알아낼 수 있습니다. 이를 위해서는 먼저 Date 객체로 변수 하나를 선언해야 하는데, 이때 매개변수는 전혀 지정하지 않아도 됩니다. 그런 후 다음 메서드를 통해 오늘 날짜의 년/월/일 등을 알아내면 됩니다.


참고로 이 날짜는 웹서비스를 제공하는 곳의 날짜가 아닌 웹브라우저를 사용하고 있는 pc의 현재 날짜 입니다.



 Date 객체의 메서드

 기능 

 getYear()

 년도 

 getMonth() 

 월(0 = 1월, 1 = 2월, ...) 

 getDate() 

 일 


예제를 보도록 하겠습니다.


<script language="Javascript>

today = new Date()

document.write("오늘 날짜는 ", today.getYear(), " 년 ", today.getMonth()+1, "월", today.getDate(), "일")

document.write(" 입니다. <p>")

</script>


중간에 today.getMonth()+1 이 조금 특이한듯 한데 today.getMonth() 리턴값이 0 부터 시작하기때문에 반드시 + 1 을 해주셔야 정상적으로 나오게 됩니다. 그 외에는 크게 특별한 부분이 없는듯 하네요.


두번째로 오늘 요일 알아내는것을 알아보겠습니다.


먼저 Date 객체로 변수 하나를 선언해야 하는데, 이때 매개변수는 전혀 지정하지 않아야 합니다. 그런 후 다음 메서드를 통해 오늘 날짜의 요일을 알아내면 됩니다.


여기에서 나오는 요일 역시 내 자신의 pc의 현재 요일입니다.



 Date 객체의 메소드 

 기능 

 getDay() 

 요닐(0 = 일요일, 1 = 월요일, ...) 


예제를 보도록 하겠습니다.


<script language="JavaScript">

today = new Date()

switch(today.getDay()){

case 0 :

document.write("오늘은 일요일입니다.")

break

case 1 :

document.write("오늘은 월요일입니다.")

break

case 2 :

document.write("오늘은 화요일입니다.")

break

case 3 :

document.write("오늘은 수요일입니다.")

break

case 4 :

document.write("오늘은 목요일입니다.")

break

case 5 :

document.write("오늘은 금요일입니다.")

break

case 6 :

document.write("오늘은 토요일입니다.")

break

}


</script>


실행결과는 오늘이 일요일이라면 today.getDay()는 리턴값으로 0 을 내놓게 되고, 오늘이 수요일이라면 today.getDay()는 리턴값으로 3을 내놓게 됩니다.


크게 어려운부분은 없는듯하네요.


세번째는 현재 시간 알아내는것을 알아보겠습니다.


 Date 객체의 메서드 

 기능 

 getHours() 

 시 

 getMinutes() 

 분 

 getSeconds() 

 초 

getMilliseconds() 

 1/100초 


예제를 보도록 하겠습니다.


<script language="Javascript">

today = new Date()

document.write("현재 시간은 ", (today.getHours() >= 12 ? "오후 ":"오전 "), today.getHours(), "시 ", today.getMinutes(), "분 ", today.getSeconds(), "초 ", today.getMilliseconds())


document.write("입니다. ")

</script>


음...보기에는 조금 긴것같은 느낌이 드네요.


우선 처음에 (today.getHours() >= 12 ? "오후 ":"오전 ")  이것은 현재 시간이 12보다 크거나 같으면 참일경우 오후라고 표시되고 거짓이면 오전이라는 의미입니다. 


지금 제가 포스팅을 작성하고 있는 시점에 나오는 결과 화면은 "현재 시간은 오전 2시 30분 11초 720입니다." 라고 나오네요.


너무 쉬운 부분이라서 특별히 어려우신 부분은 없으실겁니다.


이해가 잘 안되시거나 궁금하신거는 댓글 남겨주세요.^^

Posted by 정윤문경아빠