现有TABLE1:ID F1 F2 F3
001 A 4 7
002 A 3 5
003 B 4 3
004 B 1 2
005 B 5 4
006 C 2 3欲得到如下结果:
(即A=7/4+5/3=41/12 B=3/4+2/1+4/5=71/20 如此类推)TABLE2:F1 F2 F3
A 12 41
B 20 71
C 2 3
001 A 4 7
002 A 3 5
003 B 4 3
004 B 1 2
005 B 5 4
006 C 2 3欲得到如下结果:
(即A=7/4+5/3=41/12 B=3/4+2/1+4/5=71/20 如此类推)TABLE2:F1 F2 F3
A 12 41
B 20 71
C 2 3
select F1,sum(F2),sum(F3)
from table1
group by F1
from table1
group by F1的结果为:
F1 F2 F3
A 11 15
B 5 5
C 2 3
楼主把需求再说下吧!没看懂
zhuo=卓
SQL> select * from table1;
ID F1 F2 F3
-------------------------------------------------------------------------------- -------------------------------------------------------------------------------- ---------- ----------
001 A 4 7
002 A 3 5
003 B 4 3
004 B 1 2
005 B 5 4
006 C 2 3
6 rows selected
SQL> create or replace function func_get_num(i_str varchar2) return number
2 as
3 v_num number;
4 begin
5 execute immediate 'select '||i_str||' from dual' into v_num;
6 return v_num;
7 end;
8 /
Function created
SQL> select f1,
2 func_get_num(replace(f2, ',', '*')) f2,
3 sum(func_get_num(replace(f2, ',', '*')) * f3 / f2_old) f3
4 from (select f1, wm_concat(f2) over(partition by f1) f2, f3, f2 f2_old
5 from table1)
6 group by f1, func_get_num(replace(f2, ',', '*'));
F1 F2 F3
-------------------------------------------------------------------------------- ---------- ----------
A 12 41
C 2 3
B 20 71
SQL>
SELECT N.F1,M.F2,SUM(N.F3*M.F2/N.F2)
from
(select F1, power(10,sum(log(10,F2)))AS F2 from TABLE1 GROUP BY F1)M,TABLE1 N
WHERE M.F1=N.F1
GROUP BY N.F1,M.F2试一下,非最简
SQL> SELECT N.F1,M.F2,SUM(N.F3*M.F2/N.F2)
2 from
3 (select F1, power(10,sum(log(10,F2)))AS F2 from TABLE1 GROUP BY F1)M,TABLE1 N
4 WHERE M.F1=N.F1
5 GROUP BY N.F1,M.F2
6 ;
F1 F2 SUM(N.F3*M.F2/N.F2)
-------------------------------------------------------------------------------- ---------- -------------------
A 12 41
B 20 71
C 2 3
SQL>
i_num2 integer)
return integer as
v_num integer;
v_max_divisor integer;
begin
select decode(sign(abs(i_num1) - abs(i_num2)),
-1,
abs(i_num1),
abs(i_num2))
into v_num
from dual;
for i in 1 .. v_num loop
if mod(i_num1, i) = 0 and mod(i_num2, i) = 0 then
v_max_divisor := i;
end if;
end loop;
return v_num;
end;
create or replace function func_common_divisor(i_num1 integer,
i_num2 integer)
return integer as
v_num integer;
v_max_divisor integer;
begin
select decode(sign(abs(i_num1) - abs(i_num2)),
-1,
abs(i_num1),
abs(i_num2))
into v_num
from dual;
for i in 1 .. v_num loop
if mod(i_num1, i) = 0 and mod(i_num2, i) = 0 then
v_max_divisor := i;
end if;
end loop;
return v_max_divisor;
end;
2 (SELECT N.F1,M.F2,SUM(N.F3*M.F2/N.F2) f3
3 from
4 (select F1, power(10,sum(log(10,F2)))AS F2 from TABLE1 GROUP BY F1)M,TABLE1 N
5 WHERE M.F1=N.F1
6 GROUP BY N.F1,M.F2);
F1 F2/FUNC_COMMON_DIVISOR(CAST(F2 F3/FUNC_COMMON_DIVISOR(CAST(F2
-------------------------------------------------------------------------------- ------------------------------ ------------------------------
A 12 41
B 20 71
C 2 3
SQL>
得到的数据会是原来的整数附加一个很小的小数.需要cast成整数再进行处理.
SELECT N.F1,M.F2,SUM(N.F3*M.F2/N.F2)
from
(select F1, power(10,sum(log(10,F2)))AS F2 from TABLE1 GROUP BY F1)M,TABLE1 N
WHERE M.F1=N.F1
GROUP BY N.F1,M.F2--------------------
--顶下~