如何使用SAS、SQL提取指定短语中的数值并计算总和
Kwota数值提取求和实现方案
两种方案均适配任意数量的Kwota短语场景,无需提前固定条目数,最终输出格式与示例一致。
SAS 实现方案
核心逻辑是通过正则循环匹配文本中所有Kwota=后的数值片段,逐次转成数值累加,最后按要求格式化输出:
/* 读入待处理源文本,实际场景可替换为业务表字段读取逻辑 */ data source; length raw_text $32767; raw_text = "[Forma sprzedazy=leasing, auto: Audi A 6, Kwota=237, Cena =123],[Forma sprzedazy=leasing, auto: Volvo, Kwota=30.87, Cena =10],[Forma sprzedazy=leasing, auto: VW Golf, Kwota=292.74, Cena =134],[Forma sprzedazy=leasing, auto: VW Golf, Kwota=292.74, Cena =134],[Forma sprzedazy=leasing, auto: Porche, Kwota=300.87, Cena =152]"; output; run; data calc_result; set source; retain total_kwota 0; /* 定义正则规则:捕获Kwota=后的整数/小数值 */ re = prxparse('/Kwota=(\d+\.?\d*)/'); start_pos = 1; end_pos = length(raw_text); /* 循环匹配所有符合规则的片段,无数量限制 */ do while(prxnext(re, start_pos, end_pos, raw_text) > 0); call prxposn(re, 1, num_pos, num_len); kwota_val = input(substr(raw_text, num_pos, num_len), best12.); total_kwota + kwota_val; end; /* 按示例格式输出,小数分隔符转为逗号 */ result = catt("Kwota=", put(total_kwota, commax12.2)); keep result; run; /* 查看计算结果 */ proc print data=calc_result noobs; run;
运行后输出结果为Kwota=1154,22,与示例目标一致。
SQL 实现方案
以MySQL 8.0+递归CTE写法为例,通过递归遍历逐次截取每个Kwota对应的数值,最后聚合求和,其他支持递归CTE的数据库可按同逻辑调整语法:
WITH RECURSIVE source_data AS ( -- 源文本定义,实际场景替换为业务表对应字段即可 SELECT '[Forma sprzedazy=leasing, auto: Audi A 6, Kwota=237, Cena =123],[Forma sprzedazy=leasing, auto: Volvo, Kwota=30.87, Cena =10],[Forma sprzedazy=leasing, auto: VW Golf, Kwota=292.74, Cena =134],[Forma sprzedazy=leasing, auto: VW Golf, Kwota=292.74, Cena =134],[Forma sprzedazy=leasing, auto: Porche, Kwota=300.87, Cena =152]' AS raw_text ), num_extract AS ( -- 递归起点 SELECT 0 AS match_count, 0 AS total_sum, raw_text AS remain_str FROM source_data UNION ALL SELECT match_count + 1, total_sum + CAST( SUBSTRING( remain_str, LOCATE('Kwota=', remain_str) + 6, LOCATE(',', remain_str, LOCATE('Kwota=', remain_str)) - (LOCATE('Kwota=', remain_str) + 6) ) AS DECIMAL(12,2) ), SUBSTRING(remain_str, LOCATE(',', remain_str, LOCATE('Kwota=', remain_str)) + 1) FROM num_extract -- 终止条件:剩余文本中无Kwota字段 WHERE LOCATE('Kwota=', remain_str) > 0 ) -- 格式化最终结果,替换小数分隔符为逗号 SELECT CONCAT('Kwota=', REPLACE(FORMAT(MAX(total_sum), 2), '.', ',')) AS calc_result FROM num_extract;
执行后返回结果同样为Kwota=1154,22。如果使用PostgreSQL、Oracle等原生支持正则匹配拆分的数据库,可直接用正则拆分函数一次性提取所有数值再聚合,代码会更简洁,核心逻辑不变。
内容的提问来源于stack exchange,提问作者jacek gawrylczyk
相关产品推荐
相关产品推荐

