我想将许多记录中的数据合并为一条记录。 从
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中制作。 请帮我。谢谢。
答案 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
的值。