마농님 이하 고수님들 매번 감사합니다. <하수> 질문한개만더 .할꼐용 0 8 2,911

by 하수 [SQL Query] PROC [2009.08.18 15:39:44]


SELECT   gicode,
         gs_ym,
         co_nm,
         recent_gs_divid_rate
    FROM a

   WHERE gicode = 'A005930'
     AND(recent_gs_divid_rate <> 0
         OR recent_gs_divid_rate <> 100)
GROUP BY gicode,
         gs_ym,
         co_nm,
         recent_gs_divid_rate

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

GICODE GS_YM CO_NM RECENT_GS_DIVID_RATE

A005930 199012 삼성전기 18.75
A005930 199012 삼성항공 9.97
A005930 199112 삼성전관 5.55
A005930 199112 삼성전기 18.17
A005930 199112 삼성항공 9.97
A005930 199212 삼성전관 5.46
A005930 199212 삼성전기 17.79
A005930 199212 삼성항공 9.68
A005930 199312 SCC 44.8
A005930 199312 SEA 100
A005930 199312 SEF 95
A005930 199312 SEG 100
A005930 199312 SEI 100
A005930 199312 SEJ 100
A005930 199312 SEP 90
A005930 199312 SES 100
A005930 199312 SME 80
A005930 199312 SMI 50
-------------------------------------------------------------------


이런 rowdata를 가지고 흠....... 저는 각 년 마다 RECENT_GS_DIVID_RATE 이컬럼이

높은순으로 4개의 회사를 가저오고싶은건데요 예를들자면

GICODE GS_YM CO_NM RECENT_GS_DIVID_RATE

A005930 199312 삼성의료기기(주) 34
A005930 199312 삼성종합화학(주) 32.65
A005930 199312 (주)삼성경제연구소 30
A005930 199312 삼성데이타시스템(주) 36.66
A005930 199412 CAI 51
A005930 199412 IGT 84.3
A005930 199412 IST 33.3
A005930 199412 LUX 50.76

요런식으로 나왔으면 해요 4개가안되면 1개씩...

분석함수를 pro*c에서 못쓰기 떄문에.....ㅠㅠ 윗분이 뷰로 만들지말래요 자기가 못알아보겠다고 ㅠ

도와주세요! 고수님들!

by 대궁이 [2009.08.18 16:14:20]
WITH T AS (
SELECT 'A005930' AA,'199012' BB,'삼성전기' CC,'18.75' DD FROM DUAL
UNION ALL SELECT 'A005930' AA,'199012' BB,'삼성항공' CC,'9.97' DD FROM DUAL
UNION ALL SELECT 'A005930' AA,'199112' BB,'삼성전관' CC,'5.55' DD FROM DUAL
UNION ALL SELECT 'A005930' AA,'199112' BB,'삼성전기' CC,'18.17' DD FROM DUAL
UNION ALL SELECT 'A005930' AA,'199112' BB,'삼성항공' CC,'9.97' DD FROM DUAL
UNION ALL SELECT 'A005930' AA,'199212' BB,'삼성전관' CC,'5.46' DD FROM DUAL
UNION ALL SELECT 'A005930' AA,'199212' BB,'삼성전기' CC,'17.79' DD FROM DUAL
UNION ALL SELECT 'A005930' AA,'199212' BB,'삼성항공' CC,'9.68' DD FROM DUAL
UNION ALL SELECT 'A005930' AA,'199312' BB,'SCC' CC,'44.8' DD FROM DUAL
UNION ALL SELECT 'A005930' AA,'199312' BB,'SEA' CC,'100' DD FROM DUAL
UNION ALL SELECT 'A005930' AA,'199312' BB,'SEF' CC,'95' DD FROM DUAL
UNION ALL SELECT 'A005930' AA,'199312' BB,'SEG' CC,'100' DD FROM DUAL
UNION ALL SELECT 'A005930' AA,'199312' BB,'SEI' CC,'100' DD FROM DUAL
UNION ALL SELECT 'A005930' AA,'199312' BB,'SEJ' CC,'100' DD FROM DUAL
UNION ALL SELECT 'A005930' AA,'199312' BB,'SEP' CC,'90' DD FROM DUAL
UNION ALL SELECT 'A005930' AA,'199312' BB,'SES' CC,'100' DD FROM DUAL
UNION ALL SELECT 'A005930' AA,'199312' BB,'SME' CC,'80' DD FROM DUAL
UNION ALL SELECT 'A005930' AA,'199312' BB,'SMI' CC,'50' DD FROM DUAL
)

SELECT AA,BB,CC,DD FROM (
SELECT AA,BB,CC,DD,
ROW_NUMBER() OVER(PARTITION BY SUBSTR(BB,0,4) ORDER BY SUBSTR(BB,0,4),DD DESC) rn
FROM T
) WHERE RN < 5


by 대궁이 [2009.08.18 16:15:44]
맞나 모르겠지만;; 위에 올려진 Data 를 가지고 년도를 4자리로 구분한 후 년도별로 RATE를 정렬한후 결과를 내보았습니다..


AA BB CC DD

A005930 199012 삼성항공 9.97
A005930 199012 삼성전기 18.75
A005930 199112 삼성항공 9.97
A005930 199112 삼성전관 5.55
A005930 199112 삼성전기 18.17
A005930 199212 삼성항공 9.68
A005930 199212 삼성전관 5.46
A005930 199212 삼성전기 17.79
A005930 199312 SEF 95
A005930 199312 SEP 90
A005930 199312 SME 80
A005930 199312 SMI 50

by 하수 [2009.08.18 16:29:33]
대궁이님 감사합니다 ㅠㅠ

근데 제가 분석함수를 못쓰는 환경이라 분석함수를 안쓰고 산출해내는 방법이 무엇인지 ㅠ

by 대궁이 [2009.08.18 17:18:05]
퇴근전까지 한번 해볼께여ㅛ 될라나 모르겠네여ㅛ 초보라 ㅠㅠ

by 대궁이 [2009.08.18 17:21:58]
WITH T AS (
SELECT 'A005930' AA,'199012' BB,'삼성전기' CC,'18.75' DD FROM DUAL
UNION ALL SELECT 'A005930' AA,'199012' BB,'삼성항공' CC,'9.97' DD FROM DUAL
UNION ALL SELECT 'A005930' AA,'199112' BB,'삼성전관' CC,'5.55' DD FROM DUAL
UNION ALL SELECT 'A005930' AA,'199112' BB,'삼성전기' CC,'18.17' DD FROM DUAL
UNION ALL SELECT 'A005930' AA,'199112' BB,'삼성항공' CC,'9.97' DD FROM DUAL
UNION ALL SELECT 'A005930' AA,'199212' BB,'삼성전관' CC,'5.46' DD FROM DUAL
UNION ALL SELECT 'A005930' AA,'199212' BB,'삼성전기' CC,'17.79' DD FROM DUAL
UNION ALL SELECT 'A005930' AA,'199212' BB,'삼성항공' CC,'9.68' DD FROM DUAL
UNION ALL SELECT 'A005930' AA,'199312' BB,'SCC' CC,'44.8' DD FROM DUAL
UNION ALL SELECT 'A005930' AA,'199312' BB,'SEA' CC,'100' DD FROM DUAL
UNION ALL SELECT 'A005930' AA,'199312' BB,'SEF' CC,'95' DD FROM DUAL
UNION ALL SELECT 'A005930' AA,'199312' BB,'SEG' CC,'100' DD FROM DUAL
UNION ALL SELECT 'A005930' AA,'199312' BB,'SEI' CC,'100' DD FROM DUAL
UNION ALL SELECT 'A005930' AA,'199312' BB,'SEJ' CC,'100' DD FROM DUAL
UNION ALL SELECT 'A005930' AA,'199312' BB,'SEP' CC,'90' DD FROM DUAL
UNION ALL SELECT 'A005930' AA,'199312' BB,'SES' CC,'100' DD FROM DUAL
UNION ALL SELECT 'A005930' AA,'199312' BB,'SME' CC,'80' DD FROM DUAL
UNION ALL SELECT 'A005930' AA,'199312' BB,'SMI' CC,'50' DD FROM DUAL
)
SELECT * FROM T ,
(SELECT BB,MAX(DD) AS DD FROM T GROUP BY BB) B

WHERE T.BB= B.BB AND T.DD = B.DD







by 대궁이 [2009.08.18 17:23:05]
4개는 어케해야할지;; 결국 ROWNUM 을 써야 하는건데; GROUP 별로 그걸 못쓰니까 MAX를 이용해서 1개만 가져오는거만 가능할거같아요전;;

하지만 (BB,DD)값은 유일해야지만 가능한거라;; 좀 구리네요

by 하수 [2009.08.18 17:57:13]
ㅋㅋ 여튼 감사해요 ^^ 저도 더찾아볼게요 ㅋ

by 혈기린 [2009.08.20 14:52:32]
proc 에서 분석함수를 사용할수 있습니다
exec select ~~~ 이런식으로 사용하면 에러가 나지만 쿼리를 String변수에 담아서 실행하면 사용할수 있습니다.
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입