group by란..

보통 group by 사용할대는 합계, 평균, 집계 등등 (CUBE, SUM,AVG, 등등 여러 용도가 있지만)

중복데이터 제거할때도 많이 사용된다

DISTINCT 써서 해결이 안될경우이다.



예를들면 사용자 물품구매나, 출석기록 같다고 해야할까?

사용자 테이블 A와 조인할 테이블 B를 가지고

사용자 아이디로 조인을 걸면

ID 

 DATA

 A

 1

 A

 2

 A 3

 B

 B1


이런식으로 나오게 되고

이것을 DATA별로

사용자

 DATA1

DATA2 

DATA3 

DATA4 

A

 1

 2

 3

 1

B

 B1

 B2

 B3

 B4

이렇게 원하고 싶어서 찾다보니 GROUP BY절에 대해서 하게 되었다.




1
2
3
4
5
6
7
8
9
10
11
 
SLEECT * FROM(
SELECT 사용자이름, 사용자아이디
  FROM 사용자테이블
) A1
  LEFT OUTER JOIN
  (SELECT 데이터, 사용자아이디
   FROM 데이터테이블
)B1
ON A1.사용자아이디 = B1.사용자아이디
)
cs

약간 이런식으로 쿼리를 작성하면

A,B에대한 테이블을 조인건다.

그러면 위의 표처럼 데이터가 나올것이고

이 조인건 테이블을 가지고 GRUOP BY를 적어본다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
 
SLEECT 
 MAX(A1.유저이름), 다른 조인할 컬럼명 명시 
-- ITERATOR나 해당 LEFT OUTER JOIN으로 더 붙이거나 ..날짜면 해당 일수만큼 빼서 붙이거나..
 
 
 FROM(
  SELCT 사용자이름, 사용자 아이디
  FROM 유저테이블
) A1
  LEFT OUTER JOIN
  (SELECT 데이터, 사용자아이디
   FROM 데이터테이블
)B1
ON A1.유저아이디 = B1.유저아이디
)
 
GROUP BY 조인할 컬럼명 명시. -- SELECT 절에서 GROUP BY함수쓴 컬럼은 적지 않는다.
cs



SELECT 절에서 GROUP BY 함수를 적용한 부분은 GROUP BY절에 적지 않는다.


잘 몰라서 여러가지 GROUP BY 에러를 보았다.

그리고 함수 계산할 곳이 없는데 어쩌지 라는 생각을 했는데

아예 가변적으로 사용자 아이디(PK) 값을 MAX 함수로 적으면 그룹으로 묶어지는구나 느꼇다.


더 좋은 방법이 있을지 모르나.. 일단은 이리 해결하였으니.. 나중에 더 공부해서 보면 이불킥을 하겠지 ㅠㅠ




'ORACLE' 카테고리의 다른 글

[Oracle] 만 나이 구하기  (0) 2018.02.28
[ORACLE] 1이하의 소수점 처리  (0) 2017.09.21
[ORACLE] UNION // INTERSECT 연습  (0) 2016.09.23
1
select FLOOR(MONTHS_BETWEEN(SYSDATE,TO_DATE( '19890101','YYYYMMDD'))/12) AS AGE from dual

cs






해당 데이터에 다르지만 형태에 따라 맞춰 써주면된다.


나이정보가 들어간 테이블의 값이 'YYYY-MM-DD' 이면


 

1
select FLOOR(MONTHS_BETWEEN(SYSDATE,TO_DATE( '1989-01-01','YYYY-MM-DD'))/12) AS AGE from dual
cs



굳이 'YYYYMMDD' 형태의 값으로 뽑아 낸다고 하면

REPLACE를 사용하는 방법도 있다.


 

1
select FLOOR(MONTHS_BETWEEN(SYSDATE,TO_DATE( REPLACE('1989-01-01','-',''),'YYYYMMDD'))/12) AS AGE2 from dual
cs


결과값은 29로 현재 89년생의 1월생의 만 나이는29살이다.


 


'ORACLE' 카테고리의 다른 글

[Oracle] group by 에 대한 고찰.  (0) 2019.03.08
[ORACLE] 1이하의 소수점 처리  (0) 2017.09.21
[ORACLE] UNION // INTERSECT 연습  (0) 2016.09.23

The content of elements must consist of well-formed character data or markup.


에러가 나올경우 비교범위 문구를 처리를 안해서 나오는 에러



 '>' 이쪽 비교는 상관이 없는데


'<' 를 이리 쓰게 되면 형식이 맞지 않아 에러가 나온다.


 <![CDATA[<]]>

이걸로 바꿔서 써야함



1
2
3
sleect * from where a>4 and a<10 (x)
select * from where a>4 and a <![CDATA[<]]> 10 (o)
 
cs


TO_CHAR(NUMBER1,'FM999.00') AS NUMBER1,


해당 쿼리로 소수점 2이하의 값을 가져오는데 문제는

1이하의 값을 가져올 경우 처리가 안된다

EX) 0.5 -> .5

이리 나와서

0표시를 위하여 쿼리 수정


1
2
TO_CHAR(NUMBER1,'FM9990.00') AS NUMBER1 

cs






아마 FM을 사용하여 소수점 처리일시 

.99를 사용하면 0으로 떨어질시 소수점만 출력되거나 한자리 없어져서 그런듯



 


'ORACLE' 카테고리의 다른 글

[Oracle] group by 에 대한 고찰.  (0) 2019.03.08
[Oracle] 만 나이 구하기  (0) 2018.02.28
[ORACLE] UNION // INTERSECT 연습  (0) 2016.09.23



oracle 에서 union 은 전혀 연관없는 테이블들을 합집합의 결과값을 알려준다.


select a,b from A

union

select c,d from B


결과값은

a(a+c), b(b+d)의 결과값을 출력하게 된다.


대신 타입도 확인도 같이해서 써야한다. 

a 컬럼이 number 타입이고 c컬럼이 varchar2 타입이라면 타입이 달라서 조건이 위배된다.




 

예시코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
SELECT AA.TEST_CD, AA.TEST_NM 
    FROM    
        (    
            SELECT 
                    A.TEST_CD AS TEST_CD,
                    A.TEST_NM AS TEST_NM 
            FROM    TEST A
            WHERE A.TEST_CD = NVL(#sub_test_cd#, #test_cd#)
            
            UNION ALL
            
            SELECT   
                    B.SAMPLE_CD AS TEST_CD,
                    B.SAMPLE_NAME AS TEST_NM
            FROM SAMPLE B
cs
 


1
2
3
4
5
6
7
8
9
<isNotEmpty property="srchBusType">
            <isEqual property="srchBusType" compareValue="1">
            INTERSECT (SELECT A.TEST_CD, A.TEST_NM FROM TEST A)
            </isEqual>
            
            <isEqual property="srchBusType" compareValue="2">
            INTERSECT (SELECT B.SAMPLE_CD, B.SAMPLE_NAME FROM SAMPLE B)
            </isEqual>
</isNotEmpty>
cs




하지만 문구에따라 union으로 걸어진 값중에서 조건에 따라 어떨때는 A테이블만 어떨때는 B 테이블만 결과값을 가져오고 싶다면


INTERSECT 라는 문법을 이용하여 빼내올수 있다.








참고 주소: http://www.gurubee.net/lecture/1507


'ORACLE' 카테고리의 다른 글

[Oracle] group by 에 대한 고찰.  (0) 2019.03.08
[Oracle] 만 나이 구하기  (0) 2018.02.28
[ORACLE] 1이하의 소수점 처리  (0) 2017.09.21

+ Recent posts