方法 · 2026 年 1 月 20 日 · 11 分钟
把 SQL 当作收据,而不是魔法
问数最容易走偏的地方,是把语句藏起来,只给人看一个数字。数字漂亮,但没法反驳。我把 SQL 当收据:谁在什么时间、用哪张表、按什么过滤、得到多少行。收据可以丑,不可以缺。
收据要能重跑
换一天再跑,时间窗要写明白。用「当前日期」当锚,把「最近七天」算成起止,写进条件里。公开的提问建议也强调:相对时间必须能落到具体区间,否则同一句话昨天和今天会问出两套数。
收据要能被反驳
别人指出「你们把取消单算进去了」,你能在 WHERE 里指给他看。指不出,就不是收据,是口彩。列名、状态值、是否去重,都要写在明处。
读不懂就先拆
一层套一层的子查询,人眼会累。用 WITH 把「合格订单」和「汇总」分开。拆开不是为了炫技法,是为了让第四拍有地方落笔。
一次完整的问法可以先写成下面这样:
2026 年 3 月自然月,已支付且未取消的订单金额合计。时间按支付成功时间。
落到语句上,草稿常常是:
WITH paid AS (
SELECT order_id, pay_amount
FROM orders
WHERE pay_time >= DATE '2026-03-01'
AND pay_time < DATE '2026-04-01'
AND pay_status = 'paid'
AND cancelled_at IS NULL
)
SELECT COUNT(*) AS order_cnt, SUM(pay_amount) AS gmv
FROM paid;
把 WITH 当作收据的目录。目录清楚,对账的人不用猜你在哪一层把退款丢掉了。
入门时我给自己定的边界
问数可以学得很花。入门阶段我只守三样:问题能转发、结构能看见、语句能当收据。公开长文里还有代理循环、多层架构、图表生成。那些是工程展开,不是入门必做。
边界还有一条:不把问数当成闲聊机器人。闲聊允许含糊,问数的含糊会变成默认值,默认值会变成错数。错数一旦进了汇报,纠正成本高于当初把问题问完整。
练习用假数据。真库上只跑已经钉死的卡片。本站公开的是手艺,不是连接。把这两者分开,入门才不会在第一周就踩到权限和隐私。
读完这一辑可以做什么
选一张假的订单表。连续五天问同一句「昨天已支付金额」。把锚点、状态值、含不含今天写成卡片。五天的数能对上你自己的手工合计,入门才算落地。
收据允许丑,不允许缺时间窗。缺时间窗的漂亮语句,我当它没写完。