一、什么是“差额统计”?
礼账和普通记账最大的区别是:它要回答的不只是“花了多少钱”,而是“谁欠谁”。
举个例子:
张三结婚时你随了800。两年后你结婚,张三随了600。
普通记账App会记录两笔“支出”和“收入”,但它不会告诉你:张三还欠你200。
差额统计要做的就是这个——把“人和人之间的往来”算清楚。
二、数据聚合逻辑
差额统计的核心SQL:
SELECT
contact_id,
SUM(CASE WHEN type = 'receive' THEN amount ELSE 0 END) as total_receive,
SUM(CASE WHEN type = 'send' THEN amount ELSE 0 END) as total_send,
SUM(CASE WHEN type = 'receive' THEN amount ELSE –amount END) as net
FROM records
WHERE book_id = ?
GROUP BY contact_id
HAVING net != 0
- total_receive:对方累计给了你多少钱
- total_send:你累计给了对方多少钱
- net:净额(正数=你欠对方,负数=对方欠你)
三、前端展示方案
差额统计的结果通过两种方式展示:
1. 联系人列表页:每个联系人卡片上显示净额
张三 | 收:800 | 送:500 | 净:+300
李四 | 收:600 | 送:1000 | 净:-400
正数(绿色)表示“你欠他的”,负数(红色)表示“他欠你的”。
2. 排行榜:分别展示“收礼最多TOP5”、“送礼最多TOP5”、“净额最高TOP5”、“净额最低TOP5”。
四、性能优化
6.8万用户、62万笔记录,差额统计的查询怎么保证速度?
核心优化点:
实际测试中,最复杂的查询(按账本聚合所有联系人)响应时间约150ms。
五、净额的含义
净额的正负号容易让人困惑,简记往来的设计是:
- 正数(+) :你欠对方的。对方给你的比你给他的多,你需要“还人情”。
- 负数(-) :对方欠你的。你给他的比他给你的多,对方需要“还人情”。
这个设计让用户一眼就能看出“该回礼给谁”。

六、真实用户反馈
“以前回礼全靠猜,现在打开简记往来一搜,就知道该回多少。终于不用纠结了。”
这就是差额统计的价值——不是算账,是让人情往来更从容。





