sql怎么写求思路 oracle数据库

image.png要和并成的效果是300020202903 BO-5151-2 PP-PPH-T03:PP-PCR-CPP2500RP=1:1

FineReport krystal033 发布于 2021-1-25 12:49 (编辑于 2021-1-25 12:51)
1min目标场景问卷 立即参与
回答问题
悬赏:3 F币 + 添加悬赏
提示:增加悬赏、完善问题、追问等操作,可使您的问题被置顶,并向所有关注者发送通知
共3回答
最佳回答
0
杰杰1108Lv6初级互助
发布于2021-1-25 15:06(编辑于 2021-1-25 15:09)

写个oracle函数,将小数转换为分数,再用字段截取方式转换为比例即可(这个函数有漏洞,无限循环小数位求出来有问题)针对无限循环小数,思路有可以自己实现,1位循环=小数点后第一位/9  二位循环=小数点后两位/99依次类推

CREATE OR REPLACE
FUNCTION dftof(iStr NUMBER) RETURN varchar2 AS
--小数转分数
 v_Str varchar(50);

RESULT varchar(50);

v_fh varchar(1);
--负数符号
 v_zs varchar2(20);
--整数
 v_xs varchar2(20);
--小数
 v_pos int;
--小数点位置
 v_fm integer;
--分母
 v_fz integer;
--分子
 v_zdgys integer;
--最大公约数
--求最大公约数
 FUNCTION getZDGYS(iNum1 integer,
iNum2 integer) RETURN integer AS v_ys integer;
--余数
 v_num1 integer;

v_num2 integer;
BEGIN
	v_num1 := iNum1;

v_num2 := iNum2;

v_ys := MOD(v_num1,
v_num2);
--辗转相除法
 WHILE v_ys <> 0
LOOP
	v_num1 := v_num2;

v_num2 := v_ys;

v_ys := MOD(v_num1,
v_num2);
END
LOOP;

RETURN v_num2;
END;
BEGIN
	v_Str := trim(iStr);

v_pos := instr(v_Str, '.');
--计算小数点位置

	IF v_pos = 0 THEN RESULT := v_Str;
--纯整数
ELSE
IF
	substr(v_Str, 1, 1) = '-' THEN v_zs := substr(v_Str, 2, v_pos - 2);
--整数
ELSE v_zs := substr(v_Str, 1, v_pos - 1);
--整数
END
IF;

v_xs := substr(v_Str, v_pos + 1);
--小数

	IF to_number(nvl(v_zs, '0')) = 0 THEN
IF
		substr(v_zs, 1, 1) = '-' THEN v_zs := '-';
--如果整数为-0则显示负号
ELSE v_zs := '';
--如果整数为0则不显示整数
END
IF;
ELSE v_zs := v_zs || '+';
--整数部份显示样式
END
IF;

v_fz := to_number(v_xs);
--分子
 v_fm := power(10, LENGTH(v_xs));
--分母
 v_zdgys := getZDGYS(v_fm,
v_fz);
--求最大公约数
 RESULT := (v_fz / v_zdgys) || '/' || (v_fm / v_zdgys);
IF
	substr(v_Str, 1, 1) = '-' THEN RESULT := '-(' || v_zs || RESULT || ')';
ELSE RESULT := v_zs || RESULT;
END
IF;
END
IF;

RETURN RESULT;
END;


最佳回答
0
烟尘Lv6高级互助
发布于2021-1-25 13:10

oracle不熟

sqlserver写法(大概是)

SELECT BMBA001,BMBA002,STUFF((SELECT CONCAT(':',AA)	FROM tablename a WHERE a.BMBA001=b.BMBA001 GROUP BY a.BMBA001,a.BMBA002 FOR XML PATH(''),TYPE).value('.','NVARCHAR(MAX)'),1,1,'') AA 
FROM tablename b
GROUP BY BMBA001,BMBA002


最佳回答
0
王佳琦Lv4见习互助
发布于2021-1-25 14:30

ORACLE: 【就已知信息实现】

SELECT BMBA001 ,BMBA002,LISTAGG(AA,':') WITHIN GROUP( ORDER BY BMBA003)||'=1:1'

FROM TABLE_NAME -- 你的表名

GROUP BY BMBA001 ,BMBA002;


  • krystal033 krystal033(提问者) 1:1是算出来的后面0.41:0.41 就是1;1 如果是0.3:0.7的话就是3:7
    2021-01-25 14:32 
  • 4关注人数
  • 526浏览人数
  • 最后回答于:2021-1-25 15:09
    请选择关闭问题的原因
    确定 取消
    返回顶部