2011-03-17 75 views
0

我想将多条记录中的数据合并到一条记录中。 从Oracle7:合并数据在多条记录中与一条记录相同

 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 

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 

我知道它可以在SQL Server 2008,但我不知道它可以Oracle7中做出。 请帮帮我。谢谢。

+3

Oracle 7?真的没办法升级? – Thilo 2011-03-17 06:13:27

回答

2

Oracle 7是该数据库的良好版本。它引入了许多新功能,表现良好,显然它仍然非常稳定。但是它在这个问题上长期存在,并且在更新版本的产品中缺乏许多可用的功能。例如,我们可以用来将值聚合到一个列表中的所有常规技术仅适用于9i或更高版本。 (有些人可能在工作8I,我心里是有点模糊这里,因为它是近十年,因为我与Oracle旧工作)

所以请您在Oracle 7的任何选项?我能想到的唯一方法就是将存储过程作为报告预处理的一部分运行。该存储过程将环绕要查询的行,组装与所需输出匹配的行,然后将它们插入到不同的表中。该表然后将服务于实际的查询。

这是一个非常笨拙的解决办法,并在您的情况可能并不可行。但是,这是使用传统软件的成本。

3

前面已经有出色的APC说,这个版本是真的老了,缺乏各种功能做字符串聚集。我曾在以前的千禧年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. 

问候,
罗布。

+0

+1我忘了,我们可以从SQL调用存储功能的Oracle 7的确是一个老板的释放! – APC 2011-03-17 12:43:25

0

在特殊情况下,你必须每个不同的键只有两个记录 - 如通过您的样本数据 - 你可以这样做:

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

但是,这也不能一概而论处理超过每个密钥有两个值sum

相关问题