返回首页

抽出・集计・突合:三大数据处理模式

抽出・集计・突合:三大数据处理模式

本章讲解日本业务系统中三个最核心的数据处理概念——抽出(筛选)、集计(汇总)、突合(核对),并给出对应的 COBOL 实现代码。这三个模式是 COBOL 批处理系统的基石。

目录

  1. 概念总览
  2. 抽出(筛选)
  3. 集计(汇总)
  4. 突合(核对)
  5. 三者的组合:典型批处理流程
  6. 完整综合示例
  7. 术语对照表

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.

要点:

  1. 逐条 READ 输入文件,用 AT END 判断文件结束
  2. EXTRACT-CHECK 段落封装筛选逻辑,条件满足才 WRITE
  3. 用计数器统计输入总数与抽出数

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.

要点:

  1. 键变化检测:比较当前记录键与上一记录键,不同则输出上一组
  2. 首条处理:用 WS-FIRST 标志初始化第一个组的键
  3. 文件结束:AT END 时输出最后一组(FLUSH-GROUP)
  4. 重置累加器:输出后清零,准备下一组

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.

要点:

  1. 预读:先各读一条,进入循环
  2. 归并比较:用 EVALUATE TRUE 分四种情况处理
  3. 键小者前进:ORD-ID < SHP-ID 说明订单侧无匹配,读订单下条
  4. 键相等:核对内容(金额),一致计数,不一致记录差异
  5. 文件结束:一侧结束则另一侧剩余全部为「仅单侧有」

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 业务系统开发的核心思维。它们对应数据处理的三类基本操作:筛选、聚合、匹配。


上一章: 贪吃蛇实战解析
返回: 教程首页