You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 12:21:28