2011-03-17 2 views
0

데이터를 병합하고 싶습니다. 많은 레코드에서 하나의 레코드로 동일합니다. Oracle7 : 많은 레코드에서 하나의 레코드로 데이터 병합이 동일합니다.

FO     LINE FLOOR  COLOR SUM 
    S4714EH02    EH 11F   AK 9,18 
    S4714EH02    EH 11F   FE 9,18 
    S4714EH02    EH 12F   AK 9,18 
    S4714EH02    EH 12F   FE 9,18 

으로

 FO     LINE FLOOR COLOR SUM 
    S4714EH02    EH 11F   AK 9 
    S4714EH02    EH 11F   AK 18 
    S4714EH02    EH 11F   FE 9 
    S4714EH02    EH 11F   FE 18 
    S4714EH02    EH 12F   AK 9 
    S4714EH02    EH 12F   AK 18 
    S4714EH02    EH 12F   FE 9 
    S4714EH02    EH 12F   FE 18 

에서 나는 SQL Server 2008의 그것을 할 수있는 알고 있지만 나는 그것이 오라클 7에서 할 수 모른다. 도와주세요. 고맙습니다.

+3

Oracle 7? 정말로 업그레이드 할 방법이 없습니까? – Thilo

답변

2

Oracle 7은 해당 데이터베이스를 잘 보냈습니다. 그것은 많은 새로운 기능을 도입, 잘 수행하고 분명히 그것은 매우 안정적으로 유지됩니다. 그러나이 제품은 오래 가지 못했고 최신 버전의 제품에서는 많은 기능을 사용할 수 없습니다.

예를 들어 값을 목록으로 집계하는 데 사용할 수있는 일반적인 기술은 모두 9i 이상에서만 작동합니다.

그래서 오라클 7에서 어떤 옵션이 있습니까 (나는 오래된 오라클과 일 이후로는 거의 10이었다로 일부 8i를 작동 할 수있다, 내 마음은 여기에 약간 흐릿)? 내가 생각할 수있는 유일한 방법은보고 사전 프로세스의 일부로 저장 프로 시저를 실행하는 것입니다. 이 저장 프로시 저는 쿼리 할 행을 반복하고 원하는 출력과 일치하는 행을 어셈블 한 다음 다른 테이블에 삽입합니다. 이 테이블은 실제 쿼리를 처리합니다.

이것은 매우 clunky 임시 해결 방법이며 현재 상황에서 실행되지 않을 수 있습니다. 그러나 슬프게도 레거시 소프트웨어를 사용하는 데 드는 비용입니다.

3

이미 APC에 의하면이 버전은 실제로 오래되었고 문자열 집계를 수행하는 모든 종류의 기능이 없습니다. 나는 이전 Millenium에서 버전 7로 작업 해 왔으며, 다음 순서는 Oracle7에서 작동해야한다고 생각합니다. 나는 틀릴 수도 있지만 분명히 나는 ​​그것을 확인할 수 없다.

SQL> create table t (fo,line,floor,color,sum) 
    2 as 
    3 select 'S4714EH02', 'EH', '11F', 'AK', 9 from dual union all 
    4 select 'S4714EH02', 'EH', '11F', 'AK', 18 from dual union all 
    5 select 'S4714EH02', 'EH', '11F', 'FE', 9 from dual union all 
    6 select 'S4714EH02', 'EH', '11F', 'FE', 18 from dual union all 
    7 select 'S4714EH02', 'EH', '12F', 'AK', 9 from dual union all 
    8 select 'S4714EH02', 'EH', '12F', 'AK', 18 from dual union all 
    9 select 'S4714EH02', 'EH', '12F', 'FE', 9 from dual union all 
10 select 'S4714EH02', 'EH', '12F', 'FE', 18 from dual 
11/

Table created. 

SQL> create function f 
    2 (p_fo in t.fo%type 
    3 , p_line in t.line%type 
    4 , p_floor in t.floor%type 
    5 , p_color in t.color%type 
    6 ) return varchar2 
    7 is 
    8 cursor c 
    9 is 
10 select t.sum 
11  from t 
12  where t.fo = p_fo 
13  and t.line = p_line 
14  and t.floor = p_floor 
15  and t.color = p_color 
16  order by t.sum 
17 ; 
18 l_concatenated_sum varchar2(2000); 
19 begin 
20 for r in c 
21 loop 
22  l_concatenated_sum := l_concatenated_sum || ',' || to_char(r.sum); 
23 end loop; 
24 return substr(l_concatenated_sum,2); 
25 end f; 
26/

Function created. 

SQL> select fo 
    2  , line 
    3  , floor 
    4  , color 
    5  , f(fo,line,floor,color) sum 
    6 from t 
    7 group by fo 
    8  , line 
    9  , floor 
10  , color 
11/

FO  LI FLO CO SUM 
--------- -- --- -- -------------------- 
S4714EH02 EH 11F AK 9,18 
S4714EH02 EH 11F FE 9,18 
S4714EH02 EH 12F AK 9,18 
S4714EH02 EH 12F FE 9,18 

4 rows selected. 

감사합니다,
롭.

SELECT fo, line, floor, color, MIN(sum) || ',' || MAX(sum) 
    FROM theTable 
    GROUP BY fo, line, floor, color; 

을하지만이보다 더 처리하기 위해 일반화 될 수 없습니다 : - 귀하의 샘플 데이터 같이 - 당신이 고유 키 당 두 개의 레코드를 가지고있는 특별한 경우에

+0

+1 오라클 7에서 SQL의 저장 함수를 호출하는 것을 잊어 버렸습니다. 실제로 보스 릴리스였습니다! – APC

0

이 작업을 수행 할 수 키당 두 값은 sum입니다.

관련 문제