AutoBinding (commonController)

--*
* 클라이언트로부터의 정보를 서버에서 구조적 체계로 만들어준다.
* 간단히 말하자면 스트럿츠의 get, set 을 이용한 '데이터 자동 바인딩' 기능을 수행한다는 것이다.
--
@SuppressWarnings("unchecked")
protected void autoBinding(HttpServletRequest request, Object bean) {
try {
// 1.
java.util.Enumeration params = request.getParameterNames();
while ( params.hasMoreElements() ) {
String name = (String) params.nextElement();
Object value = null;
// 2.
try {
Class ptype = PropertyUtils.getPropertyType(bean, name);
// if(ptype != null && "java.util.Date".equals(ptype.getName())) continue;
//Date 타입일 경우 무시에서 Date 타입으로 생성해서 set 해주도록 수정 by solleep.byun 2010.02.10
if(ptype != null && "java.util.Date".equals(ptype.getName()))
{
value = request.getParameter(name);
if("".equals(CommonUtil.checkNull((String)value))) continue;
BeanUtils.setProperty(bean, name, CommonUtil.getDateForDBByYMD(value));
}
else 
{
if(ptype != null && ptype.isArray()) {
--
type 1.
<input type="text" name="arrayString" value="aaa" />
<input type="text" name="arrayString" value="bbb" />
<input type="text" name="arrayString" value="ccc" />
type 2.
arrayString=aaa&arrayString=bbb&arrayString=ccc
예외.
arrayString=aaa,bbb,ccc   <- 'aaa,bbb,ccc' 자체가 하나의 문자열
arrayString[]=aaa,bbb,ccc <- Bean 을 못찾음
--
value = request.getParameterValues(name);
}else{
value = request.getParameter(name);
}
BeanUtils.setProperty(bean, name, value);
}
} catch(java.lang.NoSuchMethodException nsm) {
--
* Bean 에 정의되어 있지 않을 경우 발생하는 Exception 을 무시한다.
* 김태현(taehyun.otr.kim)
* 2010.01.22
--
//nsm.printStackTrace();
}
}
} catch(Exception e) {
e.printStackTrace();
}
}

by darkmirr | 2012/02/24 14:10 | JAVA | 트랙백 | 덧글(0)

(OARCLE) keep(dense_rank)

keep(dense_rank {last|first} order by <>) , over(partition by XX)

 먼저 keep(dense_rank first order by )함수

A 컬럼 기준 정렬 후 지정 된 행의 B 컬럼 값 추출 하기

first나 last로 order by 한 로우에서 첫번째 혹은 마지막로우를 가져온다

 

MIN(B) (DENSE_RANK FIRST ORDER BY A [ASC|DESC])

MAX(B) (DENSE_RANK LAST ORDER BY A [ASC|DESC])

 

오라클 클럽에서 발췌한 퀴즈를 풀면서 알게 되었다는... 스칼라서브쿼리를 생각했었는데 저런 방법도 있었구나.. ㅎ

참 배울게 많다

 

--참고자료(http://3030.tistory.com/88)

field1    field2
1    c
2    b
3    a

SQL> select MIN(field1), MIN(field2) KEEP(DENSE_RANK FIRST ORDER BY field1) AS field2 from table1
결과>1, c

SQL> select MAX(field1), MAX(field2) KEEP(DENSE_RANK LAST ORDER BY field1) AS field2 from table1
결과> 3 , a

 

 

--참고자료(http://tong.nate.com/rahxephon/35087891)

COUNT(*) OVER () : 전체행 카운트

COUNT(*) OVER (PARTITION BY 컬럼) : 그룹단위로 나누어 카운트

MAX(컬럼) OVER() : 전체행 중에 최고값

MAX(컬럼) OVER(PARTITION BY 컬럼) : 그룹내 최고값

MIN(컬럼) OVER () : 전체행 중에 최소값

MIN(컬럼) OVER (PARTITION BY 컬럼) : 그룹내 최소값

SUM(컬럼) OVER () : 전체행 합

SUM(컬럼) OVER (PARTITION BY 컬럼) : 그룹내 합

AVG(컬럼) OVER () : 전체행 평균

AVG(컬럼) OVER (PARTITION BY 컬럼) : 그룹내 평균

STDDEV(컬럼) OVER () : 전체행 표준편차

STDDEV(컬럼) OVER (PARTITION BY 컬럼) : 그룹내 표준편차

RATIO_TO_REPORT(컬럼) OVER () : 현재행값/SUM(전체행값) 퍼센테이지로 나타낼경우 100곱하면 됩니다.

RATIO_TO_REPORT(컬럼) OVER (PARTITION BY 컬럼) : 현재행값 / SUM(그룹행값) 퍼센테이지로 나타낼경우 100곱하면 됩니다.

 


by darkmirr | 2011/01/26 15:31 | DB | 트랙백 | 덧글(0)

RANK() OVER와 ROW_NUMBER() OVER 차이

레코드를 특정 column의 값을 기준으로 정렬하여 순서를 매길 수 있다. RANK() OVER 또는 

ROW_NUMBER() OVER를 사용하면 된다. 간단히 아래와 같은 테이블을 생각하자.

SQL> SELECT * FROM TMP_TABLE;

USERID    |     SCORE
----------|----------
aaa       |        10
aaa       |        30
aaa       |        50
aaa       |        90
bbb       |        80
bbb       |        50
bbb       |        20
bbb       |        40
aaa       |        50

9 rows selected.

score column을 기준으로 순서를 매기고 싶다. 그러면 간단하게 다음과 같이 하면 된다.
SELECT USERID, SCORE, RANK() OVER (ORDER BY SCORE DESC) RANK
FROM TMP_TABLE;

USERID    |     SCORE|      RANK
----------|----------|----------
aaa       |        90|         1
bbb       |        80|         2
aaa       |        50|         3
aaa       |        50|         3
bbb       |        50|         3
bbb       |        40|         6
aaa       |        30|         7
bbb       |        20|         8
aaa       |        10|         9

9 rows selected.

SELECT USERID, SCORE, ROW_NUMBER() OVER (ORDER BY SCORE DESC) RANK
FROM TMP_TABLE;

USERID    |     SCORE|      RANK
----------|----------|----------
aaa       |        90|         1
bbb       |        80|         2
aaa       |        50|         3
aaa       |        50|         4
bbb       |        50|         5
bbb       |        40|         6
aaa       |        30|         7
bbb       |        20|         8
aaa       |        10|         9

9 rows selected.

위의 RANK()와 ROW_NUMBER()의 차이는 결과를 자세히 보면 알 수 있다. RANK()의 결과는 3, 4, 5번째 레코드의 점수가 50점으로 동일하기 때문에 때문에 같은 순서인 3번을 매겼다. 하지만 ROW_NUMBER()의 결과는 점수가 같더라도 레코드가 달라지면 다른 순서를 매긴다.

PARTITION BY는 select한 결과를 특정 column을 기준으로 나누는 역할을 한다.
RANK() OVER를 통해 순서를 매긴다
보통 기준으로 column을 나눈후 그 결과를 이용하여 새로운 결과를 만들어 낼때 사용한다
흔히 사용하는 결과 로는 GROUP BY 를 통해서 정렬된 데이터의 순위를 작성하거나 
결정된 순위를 더하여 총 결과를 나타낼때 사용한다 .



by darkmirr | 2011/01/25 10:23 | DB | 트랙백 | 덧글(0)

◀ 이전 페이지          다음 페이지 ▶