select한 필드들끼리 데이터의 크기를 비교해서 순위 정렬.. 0 8 4,401

by 허브 [2008.10.22 10:07:06]


데이터에 값들을 rank를 매겨서 값이 큰 순서데로 필드들을

정렬시킬는 방법 없나요? RANK(),  DENSE_RANK() 는

한필드내 데이터들에 순위를 매기는거 같은데.. (ORDER  BY 필드명 DESC)

 

전체 필드들끼리 데이터의 크기를 비교해서 순위를 매겨서

가장큰 값을 가지고잇는 필드와 데이터를  순서데로  정렬할수 있는 명령어는 없을까요?

있다면 사용법좀 알려주세요,, 혼자 해보려는데 명령어를 모르니

때려맞추는 삽질도 안되네요,,

OA       |        OB        |         OC      |

100              200                3000

이렇게 출력되는 것을

OC      |        OB        |         OA      |

3000            200                 100

이런식으로 정렬시킬수 없을까요?

by 마농 [2008.10.22 10:48:46]
SELECT pk1, pk2
, MIN(DECODE(rn,1,o)) rn_1
, MIN(DECODE(rn,2,o)) rn_2
, MIN(DECODE(rn,3,o)) rn_3
FROM
(
SELECT pk1, pk2
, DECODE(lv,1,oa,lv,2,ob,lv,3,oc) o
, ROW_NUMBER() OVER(PARTITION BY pk1, pk2 ORDER BY DECODE(lv,1,oa,lv,2,ob,lv,3,oc) DESC) rn
FROM tab1
, (SELECT LEVEL lv FROM dual CONNECT BY LEVEL <= 3)
)
GROUP BY pk1, pk2

by 허브 [2008.10.22 11:25:40]
마농님 감사합니다.
올려주신 쿼리를 조금더 구체적으로 설명해주시면 안될까요?

by 마농 [2008.10.22 11:30:58]
일단 from절만 따로 떼어 실행시켜 보시고 전체 쿼리 실행시켜 확인해 보시고 스스로 이해하려고 노력해 보세요.

by 허브 [2008.10.22 11:37:17]
위에 글에서 보여진 데이터들이여 select해서 계산된 테이블인데요
계산하는 쿼리를 마농님이 알려주신 쿼리 어느 부분에 접목시켜야 하는지
위치를 못찾겠어요,,

by 마농 [2008.10.22 11:37:37]
1. 한행의 여러 컬럼을 여러행의 하나의 컬럼으로 표시
2. 1에서 만든 컬럼값으로 정렬하여 순번 부여
3. 2에서 만든 순번에 의해 여러행의 한컬럼을 다시 한행의 여러 컬럼으로 표시

by 마농 [2008.10.22 11:39:22]
tab1 이라고 한부분에 님께서 작성하신 쿼리를 통으로 넣으시면 됩니다만...
그 전에 쿼리 자체를 수정해서 원하는 결과를 얻을 수 있을 가능성도 있습니다.

by 허브 [2008.10.22 14:30:34]
tab1 자리에

select
Round(AVG(SUM(TD_OA))), Round(AVG(SUM(TD_OB))), Round(AVG(SUM(TD_OC))),
Round(AVG(SUM(TD_OD))), Round(AVG(SUM(TD_OE))), Round(AVG(SUM(TD_OF))),
Round(AVG(SUM(TD_OG))), Round(AVG(SUM(TD_OH))), Round(AVG(SUM(TD_OI))),
Round(AVG(SUM(TD_AO))), Round(AVG(SUM(TD_AA))), Round(AVG(SUM(TD_AB))),
Round(AVG(SUM(TD_AC))), Round(AVG(SUM(TD_AD))), Round(AVG(SUM(TD_AE))),
Round(AVG(SUM(TD_AF))), Round(AVG(SUM(TD_AG))), Round(AVG(SUM(TD_AH))),
Round(AVG(SUM(TD_AI))), Round(AVG(SUM(TD_BO))), Round(AVG(SUM(TD_BA))),
Round(AVG(SUM(TD_BB))), Round(AVG(SUM(TD_BC))), Round(AVG(SUM(TD_BD)))
from system.ACCTEST_DS
WHERE YYYYMMDT in to_char(to_date('20071029','yyyymmdd')-(7*1), 'yyyymmdd')
or YYYYMMDT in to_char(to_date('20071029','yyyymmdd')-(7*2), 'yyyymmdd')
or YYYYMMDT in to_char(to_date('20071029','yyyymmdd')-(7*3), 'yyyymmdd') group by yyyymmdt

이 쿼리로 보여주는 grid들 내에서 필드 순위를 주려는데
이 쿼리로 보여주는 grid는 table에 적재되지 않아있는데 가능한가요?

by 마농 [2008.10.22 15:27:06]
님의 쿼리를 괄호안에 넣어서 From절에서 사용하세요.
그리고 제가 partition by 에서 사용한 pk1, pk2 컬럼은 행을 구분하기 위한 컬럼으로
님의 쿼리에서는 한행뿐이 없으므로 불필요한 부분입니다.
partition by pk1, pk2 는 빼셔요.
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입