客单价怎么算?
更新于 2026-09-29 · 阅读约 6 分钟
简短回答
客单价 = 销售额 ÷ 单据数,单据数要按单据号(订单号、小票号)去重。它回答的是:顾客每结一次账,平均花多少钱。
最常见的错误是在透视表里把「销售金额」的汇总方式改成「平均值」。收银系统导出的数据一行是一个商品,不是一张单,这样算出来的是每个商品行的平均金额。在下面这份超市数据里,它是 8.06 元,真实客单价是 16.57 元,差了一倍,而且不会有任何报错。
为什么透视表的「平均值」不是客单价
收银系统、电商后台导出的销售明细,通常一行是一个商品:顾客一次买了 3 样东西,这张单据就占 3 行,单据号相同。透视表的「平均值」和「计数」都是按行算的,所以:
- 「销售金额」求平均 = 销售额 ÷ 商品行数,不是 ÷ 单据数。
- 「单据号」计数 = 商品行数。要得到单据数,必须去重计数。
两者差多少,取决于平均每单有几行:按行平均 × 每单行数 = 客单价。这份超市数据平均每单 2.06 行,所以按行平均几乎正好是客单价的一半。每单买得越多的店,差得越多。
口径:同一份数据,几种算法
下表是同一份超市销售数据(5 个收银员,共 65,535 行、31,868 张单据)用不同算法得到的「客单价」:
| 算法 | 分母 | 结果(元) |
|---|---|---|
| 销售额 ÷ 去重单据数 ✓ | 31,868 张单据 | 16.57 |
| 透视表「平均值」(= 销售额 ÷ 行数) | 65,535 行 | 8.06 |
| 把 5 个收银员的客单价再平均 | — | 16.29 |
| 剔除退货单和整单作废后再算 | 31,683 张单据 | 16.69 |
- 各人的客单价不能再平均。单量少的人(许丽娟只有 155 张单)和单量多的人权重一样,结果被拉偏。总客单价要用总销售额 ÷ 总单据数。
- 退货和作废单要先定口径。这份数据里有 44 张净额为负的退货单、141 张扫了又整单取消、净额为 0 的单据。把它们剔除,客单价从 16.57 变成 16.69。差得不多,但前后对比时要用同一个口径。
- 「商品行」也不等于「商品件数」。明细里还混着「合计分舍去」(抹零,618 行)和「积点印花」(265 行)这类不是商品的行,按行算的指标会被它们进一步稀释。
实例:按收银员看客单价
同一份数据按收银员拆开。「按行平均」是透视表求平均会给你的数字,「客单价」是正确的数字:
| 收银员 | 销售额(元) | 商品行数 | 单据数 | 每单行数 | 按行平均(错误) | 客单价 |
|---|---|---|---|---|---|---|
| 林悦 | 249,513.93 | 31,521 | 15,353 | 2.05 | 7.92 | 16.25 |
| 司马婉清 | 154,467.36 | 21,297 | 10,340 | 2.06 | 7.25 | 14.94 |
| 周慧敏 | 105,850.88 | 10,044 | 4,835 | 2.08 | 10.54 | 21.89 |
| 赵雅琴 | 15,794.67 | 2,376 | 1,185 | 2.01 | 6.65 | 13.33 |
| 许丽娟 | 2,332.85 | 297 | 155 | 1.92 | 7.85 | 15.05 |
| 合计 | 527,959.69 | 65,535 | 31,868 | 2.06 | 8.06 | 16.57 |

在 Excel 里怎么算
普通透视表没有「去重计数」,计算字段又只能对字段求和后再运算,所以不能直接写出「销售额 ÷ 去重单据数」。下面三种方法按适用范围排列。
方法一:加一列「首行标记」,再用计算字段(Windows、Mac 都能用)
- 1按「单据号」排序,让同一张单据的行挨在一起。收银系统导出的数据通常已经排好。
- 2在数据最右边加一列「首行标记」。假设单据号在 B 列,在第 2 行输入
=IF(B2<>B1,1,0)并向下填充:每张单据的第一行是 1,其余是 0。这一列求和就是单据数。 - 3插入透视表:「收银员名称」拖到行,「销售金额」「首行标记」拖到值,汇总方式都是求和。
- 4点「数据透视表分析 → 字段、项目和集 → 计算字段」,名称填「客单价」,公式填
=销售金额/首行标记。
计算字段会先把两个字段分别求和,再相除,所以每个收银员和总计的客单价都是对的。代价是:数据一更新,就要重新排序、重新填充辅助列;忘了排序,单据数会多算。
方法二:数据模型 + DAX 度量值(仅 Windows)
- 1插入透视表时,勾选「将此数据添加到数据模型」。
- 2把「单据号」拖到值,在「值字段设置」里选「非重复计数」,这就是单据数。
- 3数据模型透视表不能用计算字段。要得到客单价,在字段列表里右键表名 →「添加度量值」,输入下面的公式,把「表1」换成字段列表里显示的表名。
=DIVIDE(SUM(表1[销售金额]), DISTINCTCOUNT(表1[单据号]))这是最规范的做法,但要写 DAX。Excel for Mac 没有数据模型,这个方法在 Mac 上用不了。
方法三:只要一个总数,用公式(Excel 2021 / Microsoft 365)
=SUM(H2:H65536)/COUNTA(UNIQUE(B2:B65536))H 列是销售金额,B 列是单据号,按你的数据调整范围。适合快速核对一个数字;要按收银员、按月拆开,还是要回到方法一或方法二。
在数力里
在数力里:客单价是一个度量,定义一次
数力的度量之间可以直接做加减乘除,去重计数就是汇总方式里的一项。所以客单价就是一个度量:求和(销售金额) ÷ 去重计数(单据号),不用辅助列,不用排序,也不用写 DAX。
- 1新建分析,把销售明细 CSV 或 Excel 文件拖进窗口,确认导入。
- 2点「度量值」旁边的 +,度量名称填「客单价」,切到「表达式」:左操作数选「求和」和「销售金额」,运算符选 ÷,右操作数选「去重计数」和「单据号」,保存。
- 3把「收银员名称」拖到行,「客单价」拖到度量。行换成门店、日期或别的维度,客单价照样是对的,合计行也是。
- 4同一份分析里的其他卡片都能直接用这个度量;改一次定义,所有卡片一起更新。
对数力AI 说
「按收银员看客单价,客单价 = 销售金额合计 ÷ 去重后的单据号数量」

常见问题
- 客单价和件单价、连带率是什么关系?
- 客单价 = 件单价 × 连带率。件单价是平均每件商品卖多少钱,连带率是平均每单买几件。客单价低,先看是买得少(连带率低)还是买得便宜(件单价低),改进的方向不一样。
- 电商店铺的客单价,是按订单算还是按买家算?
- 两种都有,要先看口径。按订单算是销售额 ÷ 订单数;生意参谋里的客单价是支付金额 ÷ 支付买家数,一个买家下两单只算一次。做法相同,只是去重的列从订单号换成买家 ID。
- 退货单要不要算进客单价?
- 没有统一规定,关键是前后一致。常见做法是只统计净额大于 0 的单据,退货单和整单作废的单都不计入单据数。这份超市数据里,这样算的客单价是 16.69 元,全部计入是 16.57 元。
- 为什么按收银员算的客单价,平均后和总客单价对不上?
- 因为每个人的单量不同,简单平均会让单量少的人和单量多的人权重一样。这份数据 5 个收银员的客单价简单平均是 16.29 元,总客单价是 16.57 元。总数永远用总销售额 ÷ 总单据数。
- WPS 表格能算客单价吗?
- 能。用上面方法一的思路:加一列首行标记,在 WPS 的数据透视表里插入计算字段「销售金额 / 首行标记」。