create or replace function FN_IN_BRAND_RANK(yearmonF TB_IN_POP_PROMO_M.YEAR_MON%TYPE, yearmonT TB_IN_POP_PROMO_M.YEAR_MON%TYPE, region TB_IN_POP_PROMO_M.REGION%TYPE, country TB_IN_POP_PROMO_M.COUNTRY%TYPE, product TB_IN_POP_PROMO_M.PRODUCT%TYPE, brand TB_IN_POP_PROMO_M.BRAND%TYPE) return number is
v_rank number;
begin
FOR RANKVALUES IN (
SELECT GOLD_RANK, BRAND_NAME
FROM (
SELECT
BRAND_NAME
,RANK() OVER (ORDER BY DECODE(BRAND_NAME,'LG',999999999,
GOLDEN_Y_UNCONV + GOLDEN_Y_BRAND + GOLDEN_Y_ON + GOLDEN_Y_OFF) DESC) GOLD_RANK
FROM (
SELECT 1
,PD.COUNTRY COUNTRY_NAME
,PD.BRAND BRAND_NAME
,SUM(DECODE(PD.GOLDEN_ZONE_YN,'Y',PD.UNCONVENTIONAL,0)) GOLDEN_Y_UNCONV
,SUM(DECODE(PD.GOLDEN_ZONE_YN,'Y',PD.BRAND_ONLY,0)) GOLDEN_Y_BRAND
,SUM(DECODE(PD.GOLDEN_ZONE_YN,'Y',PD.ON_PRODUCT,0)) GOLDEN_Y_ON
,SUM(DECODE(PD.GOLDEN_ZONE_YN,'Y',PD.OFF_PRODUCT,0)) GOLDEN_Y_OFF
FROM TB_IN_POP_PROMO_M PD
WHERE PD.YEAR_MON BETWEEN yearmonF AND yearmonT
AND PD.REGION = region
AND PD.COUNTRY = country
AND PD.PRODUCT = product
AND PD.BRAND <> 'RETAILER'
GROUP BY 1,PD.COUNTRY,PD.BRAND
)
)
WHERE GOLD_RANK < 5
) LOOP
IF (RANKVALUES.BRAND_NAME = brand) THEN
--DBMS_OUTPUT.put_line(brand || ' - ' || RANKVALUE.BRAND_NAME);
v_rank := RANKVALUES.GOLD_RANK;
EXIT;
END IF;
END LOOP;
return(v_rank);
end FN_IN_BRAND_RANK;
다음과 같이 function 하나를 만들었는데요, 또 항상 저런 방식으로 만들어서 사용해왔는데, 이건 도통 무슨 문제인지.. 몰라서 고수님들께 여쭤보고자 합니다.
COUNTRY BRAND GOLD_RANK FUN_RANK
Indonesia LG 1 1
Indonesia Sharp 2
Indonesia SS 3
Indonesia Toshiba 4
저 loop 안에 쿼리를 실행하면 다음과 같이 LG, SHARP, SS, Toshiba 이렇게 4건의 데이타가 나오는데요,
실제 function안에서 돌려보면 LG 만 6번 loop가 돌더라구요.. 어디가 잘 못된건지.. 봐도 잘 모르겠습니다.
고수님들의 답변 부탁드리겠습니다.
|