抽出・集计・突合:三大数据处理模式
本章讲解日本业务系统中三个最核心的数据处理概念——抽出(筛选) 、集计(汇总) 、突合(核对) ,并给出对应的 COBOL 实现代码。这三个模式是 COBOL 批处理系统的基石。
目录
概念总览
抽出(筛选)
集计(汇总)
突合(核对)
三者的组合:典型批处理流程
完整综合示例
术语对照表
1. 概念总览 在日本 IT 行业(尤其是银行、保险、物流、政府等大型机业务系统)中,数据处理工作几乎都可以归纳为三类基本操作:
术语
读音
含义
对应中文
对应英文
类比 SQL
抽出
ちゅうしゅつ
从大量数据中筛选出符合条件的记录
抽取、筛选
Extract / Select
SELECT ... WHERE
集计
しゅうけい
对数据分组汇总、统计合计
汇总、统计
Aggregate / Summarize
GROUP BY + SUM
突合
とつごう
两组数据相互对照、核对差异
核对、对账
Reconcile / Match
JOIN + 差异检查
三者的关系:
1 2 3 4 5 6 7 原始数据 ↓ 抽出(筛选出需要的记录) 中间数据 ↓ 集计(按维度汇总统计) 汇总结果 ↓ 突合(与另一份数据核对) 核对报告(一致 / 不一致清单)
记忆技巧:
抽出 = 「抽」出来 → 从多到少,筛选
集计 = 「集」起来「计」算 → 从散到合,汇总
突合 = 「突」在一起「合」对 → 两份数据核对
2. 抽出(筛选) 2.1 概念 抽出 是从输入数据中,按指定条件筛选出满足要求的记录,写入输出文件。不满足条件的记录被丢弃。
典型场景:
从全量客户数据中抽出「本月新签约的客户」
从交易流水中抽出「金额超过 100 万的记录」
从库存数据中抽出「库存低于安全库存的商品」
2.2 处理流程 1 2 输入文件 ──→ [逐条读取] ──→ [判断条件] ──→ 满足 → 写入输出文件 └──→ 不满足 → 丢弃
2.3 COBOL 示例代码 需求: 从交易文件中抽出金额 ≥ 10000 的记录。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 IDENTIFICATION DIVISION. PROGRAM-ID. EXTRACT-DEMO. *> 抽出示例: 从交易文件中筛选金额 >= 10000 的记录 ENVIRONMENT DIVISION. INPUT-OUTPUT SECTION. FILE-CONTROL. SELECT IN-FILE ASSIGN TO "transactions.txt" ORGANIZATION IS LINE SEQUENTIAL FILE STATUS IS WS-IN-STATUS. SELECT OUT-FILE ASSIGN TO "extracted.txt" ORGANIZATION IS LINE SEQUENTIAL FILE STATUS IS WS-OUT-STATUS. DATA DIVISION. FILE SECTION. FD IN-FILE. 01 IN-RECORD. 05 IN-ID PIC 9(6). 05 IN-NAME PIC X(20). 05 IN-AMOUNT PIC 9(8). FD OUT-FILE. 01 OUT-RECORD. 05 OUT-ID PIC 9(6). 05 OUT-NAME PIC X(20). 05 OUT-AMOUNT PIC 9(8). WORKING-STORAGE SECTION. 01 WS-IN-STATUS PIC XX. 01 WS-OUT-STATUS PIC XX. 01 WS-EOF PIC 9 VALUE 0. 01 WS-EXTRACT-CNT PIC 9(6) VALUE 0. 01 WS-TOTAL-CNT PIC 9(6) VALUE 0. *> 抽出条件: 金额阈值 01 WS-THRESHOLD PIC 9(8) VALUE 10000. PROCEDURE DIVISION. MAIN-PROCEDURE. OPEN INPUT IN-FILE OPEN OUTPUT OUT-FILE PERFORM UNTIL WS-EOF = 1 READ IN-FILE AT END MOVE 1 TO WS-EOF NOT AT END ADD 1 TO WS-TOTAL-CNT PERFORM EXTRACT-CHECK END-READ END-PERFORM CLOSE IN-FILE CLOSE OUT-FILE DISPLAY "抽出处理完成" DISPLAY " 输入记录数: " WS-TOTAL-CNT DISPLAY " 抽出记录数: " WS-EXTRACT-CNT STOP RUN. *> ---- 抽出判断: 满足条件则写入输出文件 ---- EXTRACT-CHECK. IF IN-AMOUNT >= WS-THRESHOLD MOVE IN-ID TO OUT-ID MOVE IN-NAME TO OUT-NAME MOVE IN-AMOUNT TO OUT-AMOUNT WRITE OUT-RECORD ADD 1 TO WS-EXTRACT-CNT END-IF.
要点:
逐条 READ 输入文件,用 AT END 判断文件结束
EXTRACT-CHECK 段落封装筛选逻辑,条件满足才 WRITE
用计数器统计输入总数与抽出数
3. 集计(汇总) 3.1 概念 集计 是对数据按某个键(维度)进行分组,计算各组的合计、件数、平均等统计值。
典型场景:
按部门集计销售额
按月份集计交易笔数与金额
按商品类别集计库存数量
3.2 处理流程 1 2 3 4 5 6 输入文件(已按集计键排序) ↓ 逐条读取 ↓ 判断集计键是否变化 ├─ 未变化 → 累加到当前组 └─ 变化 → 输出上一组小计,开始新组 ↓ 文件结束 → 输出最后一组
关键前提: 集计要求输入数据已按集计键排序 (SORT 或预先排序),这样才能用「键变化检测」实现分组。
3.3 COBOL 示例代码 需求: 按部门集计销售额(合计金额与件数)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 IDENTIFICATION DIVISION. PROGRAM-ID. SUMMARY-DEMO. *> 集计示例: 按部门汇总销售额 (输入需按部门排序) ENVIRONMENT DIVISION. INPUT-OUTPUT SECTION. FILE-CONTROL. SELECT IN-FILE ASSIGN TO "sales.txt" ORGANIZATION IS LINE SEQUENTIAL FILE STATUS IS WS-IN-STATUS. SELECT OUT-FILE ASSIGN TO "summary.txt" ORGANIZATION IS LINE SEQUENTIAL FILE STATUS IS WS-OUT-STATUS. DATA DIVISION. FILE SECTION. FD IN-FILE. 01 IN-RECORD. 05 IN-DEPT PIC X(10). 05 IN-AMOUNT PIC 9(8). FD OUT-FILE. 01 OUT-RECORD. 05 OUT-DEPT PIC X(10). 05 OUT-TOTAL PIC 9(10). 05 OUT-COUNT PIC 9(6). WORKING-STORAGE SECTION. 01 WS-IN-STATUS PIC XX. 01 WS-OUT-STATUS PIC XX. 01 WS-EOF PIC 9 VALUE 0. *> 当前集计组 01 WS-CUR-DEPT PIC X(10) VALUE SPACES. 01 WS-GROUP-TOTAL PIC 9(10) VALUE 0. 01 WS-GROUP-COUNT PIC 9(6) VALUE 0. *> 是否首条记录 01 WS-FIRST PIC 9 VALUE 1. PROCEDURE DIVISION. MAIN-PROCEDURE. OPEN INPUT IN-FILE OPEN OUTPUT OUT-FILE PERFORM UNTIL WS-EOF = 1 READ IN-FILE AT END MOVE 1 TO WS-EOF PERFORM FLUSH-GROUP NOT AT END PERFORM ACCUMULATE END-READ END-PERFORM CLOSE IN-FILE CLOSE OUT-FILE DISPLAY "集计处理完成" STOP RUN. *> ---- 累加: 检测集计键变化 ---- ACCUMULATE. IF WS-FIRST = 1 MOVE IN-DEPT TO WS-CUR-DEPT MOVE 0 TO WS-FIRST END-IF IF IN-DEPT NOT = WS-CUR-DEPT *> 键变化: 输出上一组, 开始新组 PERFORM FLUSH-GROUP MOVE IN-DEPT TO WS-CUR-DEPT END-IF ADD IN-AMOUNT TO WS-GROUP-TOTAL ADD 1 TO WS-GROUP-COUNT. *> ---- 输出当前组小计并重置 ---- FLUSH-GROUP. IF WS-GROUP-COUNT > 0 MOVE WS-CUR-DEPT TO OUT-DEPT MOVE WS-GROUP-TOTAL TO OUT-TOTAL MOVE WS-GROUP-COUNT TO OUT-COUNT WRITE OUT-RECORD DISPLAY "部门: " WS-CUR-DEPT " 合计: " WS-GROUP-TOTAL " 件数: " WS-GROUP-COUNT END-IF MOVE 0 TO WS-GROUP-TOTAL MOVE 0 TO WS-GROUP-COUNT.
要点:
键变化检测 :比较当前记录键与上一记录键,不同则输出上一组
首条处理 :用 WS-FIRST 标志初始化第一个组的键
文件结束 :AT END 时输出最后一组(FLUSH-GROUP)
重置累加器 :输出后清零,准备下一组
3.4 用 SORT 预处理 若输入未排序,可先用 SORT 排序:
1 2 3 4 SORT SORT-FILE ON ASCENDING KEY SORT-DEPT USING IN-FILE GIVING SORTED-FILE.
4. 突合(核对) 4.1 概念 突合 是将两组数据按某个键(突合键)相互对照,检查是否一致,找出:
一致 的记录
仅左侧存在 的记录(如:有订单无发货)
仅右侧存在 的记录(如:有发货无订单)
键相同但内容不同 的记录(如:金额不符)
典型场景:
销售数据与收款数据突合,找出未收款交易
订单数据与发货数据突合,找出漏发
系统数据与银行流水突合,日终对账
4.2 处理流程(双文件匹配) 1 2 3 4 5 6 7 8 9 10 文件A(按键排序) 文件B(按键排序) ↓ ↓ └────── 逐条比较键 ──────┘ │ ┌──────────┼──────────┐ │ │ │ A键 < B键 A键 = B键 A键 > B键 │ │ │ 仅A有 匹配 仅B有 (读A下条) (核对内容) (读B下条)
4.3 COBOL 示例代码 需求: 将订单文件与发货文件突合,找出未发货订单、无订单发货、金额不符。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 IDENTIFICATION DIVISION. PROGRAM-ID. RECONCILE-DEMO. *> 突合示例: 订单文件 vs 发货文件 (两文件均按订单号排序) ENVIRONMENT DIVISION. INPUT-OUTPUT SECTION. FILE-CONTROL. SELECT ORDER-FILE ASSIGN TO "orders.txt" ORGANIZATION IS LINE SEQUENTIAL FILE STATUS IS WS-ORD-STATUS. SELECT SHIP-FILE ASSIGN TO "ships.txt" ORGANIZATION IS LINE SEQUENTIAL FILE STATUS IS WS-SHP-STATUS. SELECT RESULT-FILE ASSIGN TO "reconcile.txt" ORGANIZATION IS LINE SEQUENTIAL FILE STATUS IS WS-RES-STATUS. DATA DIVISION. FILE SECTION. FD ORDER-FILE. 01 ORDER-RECORD. 05 ORD-ID PIC 9(6). 05 ORD-AMOUNT PIC 9(8). FD SHIP-FILE. 01 SHIP-RECORD. 05 SHP-ID PIC 9(6). 05 SHP-AMOUNT PIC 9(8). FD RESULT-FILE. 01 RES-RECORD. 05 RES-TYPE PIC X(12). 05 RES-ID PIC 9(6). 05 RES-DETAIL PIC X(40). WORKING-STORAGE SECTION. 01 WS-ORD-STATUS PIC XX. 01 WS-SHP-STATUS PIC XX. 01 WS-RES-STATUS PIC XX. 01 WS-ORD-EOF PIC 9 VALUE 0. 01 WS-SHP-EOF PIC 9 VALUE 0. *> 统计 01 WS-MATCH-CNT PIC 9(6) VALUE 0. 01 WS-ONLY-ORD PIC 9(6) VALUE 0. 01 WS-ONLY-SHP PIC 9(6) VALUE 0. 01 WS-DIFF-CNT PIC 9(6) VALUE 0. PROCEDURE DIVISION. MAIN-PROCEDURE. OPEN INPUT ORDER-FILE OPEN INPUT SHIP-FILE OPEN OUTPUT RESULT-FILE *> 预读两文件首条记录 PERFORM READ-ORDER PERFORM READ-SHIP *> 双文件归并比较 PERFORM UNTIL WS-ORD-EOF = 1 AND WS-SHP-EOF = 1 EVALUATE TRUE WHEN WS-ORD-EOF = 1 PERFORM HANDLE-ONLY-SHIP WHEN WS-SHP-EOF = 1 PERFORM HANDLE-ONLY-ORDER WHEN ORD-ID < SHP-ID PERFORM HANDLE-ONLY-ORDER WHEN ORD-ID > SHP-ID PERFORM HANDLE-ONLY-SHIP WHEN OTHER PERFORM HANDLE-MATCH END-EVALUATE END-PERFORM CLOSE ORDER-FILE CLOSE SHIP-FILE CLOSE RESULT-FILE DISPLAY "突合处理完成" DISPLAY " 一致: " WS-MATCH-CNT DISPLAY " 仅订单: " WS-ONLY-ORD DISPLAY " 仅发货: " WS-ONLY-SHP DISPLAY " 金额不符: " WS-DIFF-CNT STOP RUN. *> ---- 读取订单文件 ---- READ-ORDER. READ ORDER-FILE AT END MOVE 1 TO WS-ORD-EOF END-READ. *> ---- 读取发货文件 ---- READ-SHIP. READ SHIP-FILE AT END MOVE 1 TO WS-SHP-EOF END-READ. *> ---- 仅订单有: 未发货 ---- HANDLE-ONLY-ORDER. MOVE "未发货" TO RES-TYPE MOVE ORD-ID TO RES-ID MOVE "订单存在但无发货记录" TO RES-DETAIL WRITE RES-RECORD ADD 1 TO WS-ONLY-ORD PERFORM READ-ORDER. *> ---- 仅发货有: 无订单 ---- HANDLE-ONLY-SHIP. MOVE "无订单发货" TO RES-TYPE MOVE SHP-ID TO RES-ID MOVE "发货存在但无订单记录" TO RES-DETAIL WRITE RES-RECORD ADD 1 TO WS-ONLY-SHP PERFORM READ-SHIP. *> ---- 键匹配: 核对金额 ---- HANDLE-MATCH. IF ORD-AMOUNT = SHP-AMOUNT ADD 1 TO WS-MATCH-CNT ELSE MOVE "金额不符" TO RES-TYPE MOVE ORD-ID TO RES-ID MOVE "订单金额与发货金额不一致" TO RES-DETAIL WRITE RES-RECORD ADD 1 TO WS-DIFF-CNT END-IF PERFORM READ-ORDER PERFORM READ-SHIP.
要点:
预读 :先各读一条,进入循环
归并比较 :用 EVALUATE TRUE 分四种情况处理
键小者前进 :ORD-ID < SHP-ID 说明订单侧无匹配,读订单下条
键相等 :核对内容(金额),一致计数,不一致记录差异
文件结束 :一侧结束则另一侧剩余全部为「仅单侧有」
5. 三者的组合:典型批处理流程 实际业务系统中,这三个模式常组合使用,形成完整的批处理流水线:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ┌─────────────────────────────────────────────────┐ │ 日终批处理 (日次バッチ) │ ├─────────────────────────────────────────────────┤ │ │ │ 1. 抽出: 从当日交易流水抽出有效交易 │ │ (排除取消、测试数据) │ │ ↓ │ │ 2. 集计: 按客户/部门汇总交易金额 │ │ ↓ │ │ 3. 突合: 与账户余额文件核对 │ │ (检查借贷平衡) │ │ ↓ │ │ 4. 输出: 对账报告 + 异常清单 │ │ │ └─────────────────────────────────────────────────┘
对应的 COBOL 程序结构:
1 2 3 4 5 6 MAIN-PROCEDURE. PERFORM EXTRACT-PROCESS *> 抽出 PERFORM SUMMARY-PROCESS *> 集计 PERFORM RECONCILE-PROCESS *> 突合 PERFORM OUTPUT-REPORT *> 输出报告 STOP RUN.
6. 完整综合示例 下面是一个把抽出、集计、突合串起来的完整示例框架:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 IDENTIFICATION DIVISION. PROGRAM-ID. BATCH-DEMO. *> 综合示例: 抽出 -> 集计 -> 突合 的批处理流程 ENVIRONMENT DIVISION. INPUT-OUTPUT SECTION. FILE-CONTROL. SELECT RAW-FILE ASSIGN TO "raw.txt" ORGANIZATION IS LINE SEQUENTIAL. SELECT EXTRACT-FILE ASSIGN TO "extract.txt" ORGANIZATION IS LINE SEQUENTIAL. SELECT SUMMARY-FILE ASSIGN TO "summary.txt" ORGANIZATION IS LINE SEQUENTIAL. SELECT MASTER-FILE ASSIGN TO "master.txt" ORGANIZATION IS LINE SEQUENTIAL. SELECT REPORT-FILE ASSIGN TO "report.txt" ORGANIZATION IS LINE SEQUENTIAL. DATA DIVISION. FILE SECTION. FD RAW-FILE. 01 RAW-RECORD. 05 RAW-DEPT PIC X(10). 05 RAW-AMOUNT PIC 9(8). 05 RAW-FLAG PIC X. FD EXTRACT-FILE. 01 EXT-RECORD. 05 EXT-DEPT PIC X(10). 05 EXT-AMOUNT PIC 9(8). FD SUMMARY-FILE. 01 SUM-RECORD. 05 SUM-DEPT PIC X(10). 05 SUM-TOTAL PIC 9(10). FD MASTER-FILE. 01 MST-RECORD. 05 MST-DEPT PIC X(10). 05 MST-TOTAL PIC 9(10). FD REPORT-FILE. 01 RPT-RECORD PIC X(80). WORKING-STORAGE SECTION. 01 WS-EOF PIC 9 VALUE 0. PROCEDURE DIVISION. MAIN-PROCEDURE. DISPLAY "=== 批处理开始 ===" PERFORM EXTRACT-PROCESS PERFORM SUMMARY-PROCESS PERFORM RECONCILE-PROCESS DISPLAY "=== 批处理结束 ===" STOP RUN. *> ---- 阶段1: 抽出 (排除取消记录) ---- EXTRACT-PROCESS. DISPLAY "[1/3] 抽出处理..." OPEN INPUT RAW-FILE OPEN OUTPUT EXTRACT-FILE MOVE 0 TO WS-EOF PERFORM UNTIL WS-EOF = 1 READ RAW-FILE AT END MOVE 1 TO WS-EOF NOT AT END IF RAW-FLAG NOT = "C" *> C=取消 MOVE RAW-DEPT TO EXT-DEPT MOVE RAW-AMOUNT TO EXT-AMOUNT WRITE EXT-RECORD END-IF END-READ END-PERFORM CLOSE RAW-FILE CLOSE EXTRACT-FILE. *> ---- 阶段2: 集计 (按部门汇总) ---- SUMMARY-PROCESS. DISPLAY "[2/3] 集计处理..." *> 实际实现参考第 3 节的 SUMMARY-DEMO *> 此处省略具体代码, 逻辑为: 按部门累加金额并输出 CONTINUE. *> ---- 阶段3: 突合 (与主数据核对) ---- RECONCILE-PROCESS. DISPLAY "[3/3] 突合处理..." *> 实际实现参考第 4 节的 RECONCILE-DEMO *> 此处省略具体代码, 逻辑为: 集计结果与主数据比对 CONTINUE.
7. 术语对照表
日语
假名
中文
英文
SQL 类比
抽出
ちゅうしゅつ
抽取、筛选
Extract / Select
WHERE
抽出条件
ちゅうしゅつじょうけん
筛选条件
Selection Criteria
WHERE 子句
抽出件数
ちゅうしゅつけんすう
抽取记录数
Extract Count
COUNT(*)
集计
しゅうけい
汇总、统计
Aggregate / Summarize
GROUP BY
集计表
しゅうけいひょう
汇总表
Summary Table
聚合结果
集计键
しゅうけいキー
汇总键
Group Key
GROUP BY 字段
突合
とつごう
核对、对账
Reconcile / Match
JOIN
突合键
とつごうキー
核对键
Match Key
JOIN ON 字段
突合处理
とつごうしょり
核对处理
Reconciliation
—
照合
しょうごう
对照、核对
Verification
—
不一致
ふいっち
不一致
Mismatch
差异行
未入金
みにゅうきん
未收款
Unpaid
—
未发货
みはっか
未发货
Unshipped
—
日次バッチ
にちじバッチ
日终批处理
Daily Batch
—
小结
模式
核心操作
COBOL 关键语句
前提条件
抽出
条件筛选
READ + IF + WRITE
无
集计
分组汇总
READ + 键变化检测 + 累加
输入需按键排序
突合
双文件匹配
双 READ + 归并比较
两文件均按键排序
掌握这三个模式,就掌握了 COBOL 业务系统开发的核心思维 。它们对应数据处理的三类基本操作:筛选、聚合、匹配 。
上一章: 贪吃蛇实战解析 返回: 教程首页