2014-09-03 1 views
1

열에서만 금액 ($ 기호 이후 번호) 및 비율 (% 기호 앞에 숫자)를 얻기 위해,의는 표 1에서 생각한 내가 좀하고 싶습니다 무엇SQL 내가 다음과 같이 몇 가지 규칙 설명이

rule_id rule_desc 
F89 Ded2 + $100 Copay + 20% Coins; $750 Max + $250 Penalty 
F70 Ded1+$250Copay+50%;Upto $500 max+50%Penalty 

이 위의 예에서 즉 ..

For F89, 
Copay = 100 
Coins = 20 
Max = 750 
Penalty = 250 

그리고 F70에 대한

,

Copay = 250 
Coins = 50 
Max = 500 
Penalty = 0.5 (50/100) 

누군가는 쓰기이에 도움을 주시기 바랍니다 수 SQL 쿼리 (Oracle SQL Developer 사용)를 사용하면 Copay, Coins, Max 및 Penalty에 대해 여러 행 또는 개별 열의 결과를 얻을 수 있으므로 최대한 빨리 도와주십시오.

+0

나는 Perl/Java/Ruby/Python /에서의 후 처리 단계로 그렇게 할 것입니다. 귀하의 규칙 설명의 "문법"이 매우 느슨한 것 같습니다. – Thilo

+0

내가 추가하고 싶은 정보는 Copay 금액은 항상 테스트 "Copay"이전에 언급 된 것과 비슷합니다. 동전을 제외하고. 때로는 동전이 텍스트 동전없이 언급되므로 동전과 백분율을 구별하기 위해 페널티 비율 또는 금액이 텍스트 "페널티"보다 먼저 정의됩니다. 또한이 모든 값들이 반드시 있어야하는 것은 아니며 때로는 "$ 50 Copay"또는 때때로 "Ded1 + 20 % Coins"일 수도 있습니다. – Chito

답변

1

모든 요구 사항에 따라 요구 사항이 달라질 수 있습니다. 귀하가 제공 한 데이터의 종류 및 특정 가정에이 쿼리는 도움이 될 수있다 -

WITH tab(rule_id, rule_desc) AS 
    (SELECT 'F89', 'Ded2 + $100 Copay + 20% Coins; $750 Max + $250 Penalty' from dual union all 
    SELECT 'F70', 'Ded1+$250Copay+50%;Upto $500 max+50%Penalty' FROM dual union all 
    SELECT 'F71', '$50 Copay' FROM dual union all 
    SELECT 'F72', 'Ded1 + 20% Coins' FROM dual), 
----------------------------------------------- 
---- End of data preparation 
----------------------------------------------- 
temp_table as (SELECT rule_id, REGEXP_SUBSTR (rule_desc,'[^\+|;]+',1,LEVEL) txt 
       FROM tab 
       CONNECT BY REGEXP_SUBSTR (rule_desc,'[^\+|;]+',1,LEVEL) IS NOT NULL 
        AND PRIOR rule_desc = rule_desc 
        AND PRIOR sys_guid() IS NOT NULL), 
final_table as (
SELECT RULE_ID, TXT, 
     coalesce(REGEXP_SUBSTR(replace(TXT, 'Upto'), '[a-z,A-Z]+'), 'Coins') "KEY", 
     REGEXP_SUBSTR(TXT, '[0-9]+') "VALUE", 
     REGEXP_SUBSTR(TXT, '\W+') "SIGN" 
    FROM temp_table) 
SELECT RULE_ID, 
     KEY ||'='|| 
     case when SIGN = '%' and KEY = 'Penalty' then 
      to_char(VALUE/100) 
     else 
      VALUE 
     end STR 
    FROM final_table 
WHERE key not in ('Ded'); 

출력 :

| RULE_ID |   STR | 
|---------|-------------| 
|  F71 | Copay=50 | 
|  F72 | Coins=20 | 
|  F70 | Copay=250 | 
|  F70 | Coins=50 | 
|  F70 |  max=500 | 
|  F70 | Penalty=.5 | 
|  F89 | Copay=100 | 
|  F89 | Coins=20 | 
|  F89 |  Max=750 | 
|  F89 | Penalty=250 | 

가정 사항을 명확히 :

1) 만 키를 누락 될 수있다 "코인 "

2) 백분율 계산은 페널티에만 적용됩니다.

3) 페널티 KEY에는 "Upto"문자열 만 사용할 수 있습니다. 이 쿼리에서는 "Upto"가 모든 키에서 제거됩니다.

도움이 될지 모르겠지만 어떤 방식 으로든 표시되기를 바랍니다.

+0

감사합니다. – Chito

관련 문제