Group By 질문입니다. 0 11 1,713

by 박동혁 [2007.11.22 10:13:56]


안녕하세요~

어제 질문 드렸던 것이 아직 해결이 안되어서 다시 질문 드립니다.

 

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

계약번호   고객번호   입금연월일   통번   입금처리연월일   연체액   원본잔액

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

00001       111111      20070105       0        20070106           10000     9000000

00001       111111      20070105       1        20070106           20000     8990000

00001       111111      20070106       0        20070107           70000     8000000

00002       111112      20070105       0        20070401           20000     4000000

00001       111111      20070105       1        20070406           40000     9222200

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

 

위의 데이타에서

계약번호, 고객번호, 입금연월일을 기준으로 통번이 최대값인 것들을 뽑아내고 싶습니다.

즉, 아래와 같은 결과를 원합니다.

 

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

계약번호   고객번호   입금연월일   통번   입금처리연월일   연체액   원본잔액

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

00001        111111      20070105      1       20070106            20000     8990000

00001        111111      20070106      0       20070107            70000     8000000

00001        111111      20070105      1       20070406            40000     9222200

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

 

    SELECT  B.계약번호, B.고객번호, B.입금연월일, MAX(B.통번)

       FROM  계약마스타 A, 입금 B 
     WHERE  A.계약번호 = B.계약번호
         AND   A.고객번호 = B.고객번호

GROUP BY   B.계약번호, B.고객번호, B.입금연월일

 

--> 이렇게하면 결과가 나옵니다. 그러나,

 

SELECT  B.계약번호, B.고객번호, B.입금연월일, MAX(B.통번), B.입금처리연월일, B.연채액, B.원본잔액

       FROM  계약마스타 A, 입금 B 
     WHERE  A.계약번호 = B.계약번호
         AND   A.고객번호 = B.고객번호

GROUP BY   B.계약번호, B.고객번호, B.입금연월일

 

--> 이렇게 하면 GROUB BY 에러가 납니다.

 

 

고수님들...이런 경우는 어떻게 해줘야 하나요?

그럼, 부탁 드리겠습니다. 감사합니다.

 

by 마농 [2007.11.22 00:00:00]
SELECT *
FROM
(
SELECT B.계약번호, B.고객번호, B.입금연월일, B.통번, B.입금처리연월일, B.연채액, B.원본잔액
, ROW_NUMBER() OVER(PARTITION BY B.계약번호, B.고객번호, B.입금연월일 ORDER BY B.통번) rn
FROM 계약마스타 A, 입금 B
WHERE A.계약번호 = B.계약번호
AND A.고객번호 = B.고객번호
)
WHERE rn = 1

by 채용근 [2007.11.22 00:00:00]
마농님 쿼리보고 썼다가 당장 지웠음 ㅋㅋ

by 마농 [2007.11.22 00:00:00]
질문만 읽어보면 B.입금연월일 까지만 그룹지으면 될듯 하나, 위의 결과대로 나오려면 B.입금처리연월일 까지도 partition by 절에 들어가야 할듯.

by 박동혁 [2007.11.22 00:00:00]
마농님 감사합니다.
그런데...그렇게 하니 통번이 0인것만 추출됩니다.
통번이 MAX인것을 원하는데...제가 잘못 한건지 모르겠습니다.
테이블과 칼럼이 일본어로 되어 있어서...
어떻게 옮겨 적다보니...혼선이 생기는거 같습니다.
다시 한번 해보도록 하겠습니다.
감사드립니다~

by 마농 [2007.11.22 00:00:00]
통번 DESC

by 범정 [2007.11.22 00:00:00]
역시대단하심...

by finecomp [2007.11.22 00:00:00]
분명 결과는 같습니다만 질문에 조건이 명시되어 있지 않군요...전체 테이블의 데이터를 전부 가져오는 건 아닐 것 같은데요...;
결과가 그룹핑 컬럼들 외에 질문처럼 몇개 안된다면 실제 운영 access 데이터량에 따라 마농님의 방법이나 아래 중 성능테스트 후 선택하시면 되겠군요.

SELECT B.계약번호, B.고객번호, B.입금연월일, MAX(B.통번) AS 통번, B.입금처리연월일
, SUBSTR(MAX(LPAD(B.통번,4,'0')||B.연체액), 5) AS 연체액
, SUBSTR(MAX(LPAD(B.통번,4,'0')||B.원본잔액), 5) AS 원본잔액
FROM 계약마스타 A, 입금 B
WHERE A.계약번호 = B.계약번호
AND A.고객번호 = B.고객번호
GROUP BY B.계약번호, B.고객번호, B.입금연월일, B.입금처리연월일

건승하시길...수고하세요~~

by finecomp [2007.11.22 00:00:00]
단, 전체 데이터가 얼마 안되거나 대용량테이블이라도 개발용 데이터만 소량 들어있다면 sort량이 얼마안되어 두 방법의 성능이 차이가 없을 것 입니다...참고하세요.

by 손님 [2007.11.22 00:00:00]
혹시 요렇게 하면 되지 않을까 싶은데요..
테스트는 안했습니다만,, 응용하시길..
그리고 group by에서 에러나는데 왜 에러가 나는지 공부 좀 하시길..... 그럼 좋은 하루를

WITH TEST AS
(
SELECT B.* FROM 계약마스타 A, 입금 B
WHERE A.계약번호 = B.계약번호
AND A.고객번호 = B.고객번호
) SELECT * FROM
(
SELECT TEST.*,row_number() over(partition by계약번호、고객번호、입금연월일 order by 통번 desc) rn FROM TEST
) WHERE rn=1

by 손님 [2007.11.22 00:00:00]
다들 음청 빠르시네요... 내가 느린건지,,,

by 박동혁 [2007.11.22 00:00:00]
좋은 답변 감사드립니다.
지금 알려주신 내용을 바탕으로 진행중입니다.
부디 잘 응용해서 좋은 결과 나오도록 하겠습니다.
그리고, 공부하겠습니다.^^*

그럼, 즐거운 하루들 되시길 바랍니다~
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입