행-> 열변환 (마농님 부탁합니다.) 0 4 2,094

by 손님 회계 행열변환 [2009.02.17 20:29:57]


SELECT A.GJDT,
  A.ACNO,
  A.EXENO,
  MAX(DECODE(A.R - B.R1, 0, RATE)) M,
  MAX(DECODE(A.R - B.R1, 1, RATE)) M,
  MAX(DECODE(A.R - B.R1, 2, RATE)) M,
  MAX(DECODE(A.R - B.R1, 3, RATE)) M,
  MAX(DECODE(A.R - B.R1, 4, RATE)) M,
  MAX(DECODE(A.R - B.R1, 5, RATE)) M,
  MAX(DECODE(A.R - B.R1, 6, RATE)) M,
  MAX(DECODE(A.R - B.R1, 7, RATE)) M,
  MAX(DECODE(A.R - B.R1, 8, RATE)) M,
  MAX(DECODE(A.R - B.R1, 9, RATE)) M

FROM TEST_C, (
    SELECT ROWNUM R,
      GJDT,
      ACNO,
      EXENO
 
    FROM TEST_C
    WHERE GJDT = '20090220'
    GROUP BY GJDT, ACNO, EXENO
    
) A,
  (
    SELECT MIN(ROWNUM) R1 ,
      GJDT
    
 
    FROM TEST_C
    WHERE GJDT = '20090220'
   
 
    GROUP BY GJDT )B
GROUP BY A.GJDT, A.ACNO, A.EXENO;

결과 부분.

두번째의 RATE가 나오지 않습니다.

20090220 1001 10 10 11 12 13 14 15 16 17 18 19
20090220 1001 11          

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

SELECT rownum, GJDT, ACNO, EXENO
from TEST_c
GROUP BY rownum,GJDT, ACNO, EXENO
order by rownum
;

상단의쿼리 결과.

1    20090220   1001    10
2    20090220   1001    10
3    20090220   1001    10
4    20090220   1001    10
5    20090220   1001    10
6    20090220   1001    10
7    20090220   1001    10
8    20090220   1001    10
9    20090220   1001    10
10 20090220   1001     10
11 20090220   1001     11
12 20090220   1001     11
13 20090220   1001     11
14 20090220   1001     11
15 20090220   1001     11
16 20090220   1001     11
17 20090220   1001     11
18 20090220   1001     11
19 20090220   1001     11
20 20090220   1001     11

 

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

두번째에도 해당 RATE의 결과가 나오도록 하고 싶은데..

 ROWNUM의 특성을 잘 몰라서.. 이런 문제가 발생한거 같습니다.

GROUP BY로 하면 ROWNUM이 1-10나오고 다시 1-10까지 나올줄 알았는데..

혹시 다른방법이나, 아니면 ROWNUM으로 나오게 하는 방법 없을까요?

마농님.. 부탁합니다.^^

by 호야 [2009.02.18 09:30:25]
ROWNUM 은 말 그대로 반환 되는 행의 기본 번호 입니다.
즉, 그룹바이를 한다고 해서 1~20 까지 번호가 이미 정해 졌는데
이게 1~10 으로 다시 묶여 지지는 않죠
상단과 같이 1~20개가 있는 행을 ROWNUM 을 썼을 때에는
1~20 이 상위 결과 값 처럼 나오구요
ROW_NUMBER()OVER(PARTITION BY GJDT)
이런씩으로 표현을 하면
GJDT을 그룹 모임의 조건으로 보고 그에 따른
날짜별 ROWNUM이 추출되게 됩니다.
질문이 이어진거 같아서 원본글을 못봐서 자세한 쿼리 내용을 모르겠네요.ㅎ

by 손님 [2009.02.18 10:33:37]
하나의 질문인데 조금 보기 어렵게 올려졌나봐요..
답변 많이 기대했는데.. 호야님 감사합니다.


by 피터 [2009.02.18 12:26:33]
SELECT GJDT, ACNO, EXENO
, MAX(C1) C1
, MAX(C2) C2
, MAX(C3) C3
, MAX(C4) C4
, MAX(C5) C5
, MAX(C6) C6
, MAX(C7) C7
, MAX(C8) C8
, MAX(C9) C9
, MAX(C10) C10
FROM (
SELECT GJDT, ACNO, EXENO
, DECODE(MOD(ROWNUM,10),1,RATE) C1
, DECODE(MOD(ROWNUM,10),2,RATE) C2
, DECODE(MOD(ROWNUM,10),3,RATE) C3
, DECODE(MOD(ROWNUM,10),4,RATE) C4
, DECODE(MOD(ROWNUM,10),5,RATE) C5
, DECODE(MOD(ROWNUM,10),6,RATE) C6
, DECODE(MOD(ROWNUM,10),7,RATE) C7
, DECODE(MOD(ROWNUM,10),8,RATE) C8
, DECODE(MOD(ROWNUM,10),9,RATE) C9
, DECODE(MOD(ROWNUM,10),0,RATE) C10
FROM T
)
GROUP BY GJDT, ACNO, EXENO
;

by 손님 [2009.02.18 16:09:59]
피터님 감사합니다.
이런 방법도 있었군요..
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입