Oracle7:合并数据在许多记录中与一条记录相同

时间:2011-03-17 06:11:28

标签: oracle merge

我想将许多记录中的数据合并为一条记录。 从

       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 个答案:

答案 0 :(得分: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.

的问候,
罗布。

答案 1 :(得分:2)

Oracle 7是该数据库的精美版本。它引入了许多新功能,表现良好,显然仍然非常稳定。但它的确存在很长时间,并且在最新版本的产品中缺少许多功能。

例如,我们可以用来将值聚合到列表中的所有常规技术仅适用于9i或更高版本。 (有些人可能会在8i工作,我的思想在这里有点模糊,因为我与Oracle合作已经差不多十年了)

那么你在Oracle 7中有什么选择吗?我能想到的唯一一个是将存储过程作为报告预处理的一部分。此存储过程将循环您要查询的行,组合与所需输出匹配的行,然后将它们插入到不同的表中。然后,该表将为实际查询提供服务。

这是一种极其笨重的解决方法,在您的情况下可能不可行。但唉,这是使用传统软件的成本。

答案 2 :(得分:0)

在特殊情况下,每个不同的密钥只有两个记录 - 如示例数据所示 - 您可以这样做:

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

但是,这不能概括为每个键处理两个以上sum的值。