Excel基于最近前置日期的VLOOKUP结果筛选及交易关联分析需求
我来帮你梳理下怎么搞定这个需求,分两种场景给你方案,先从Excel本身就能实现的方法说起,不需要额外工具也能完成:
一、Excel内置函数实现(适合数据量不大的情况)
假设你的两张表分别命名为总消费表(列:Customer_ID、Total_$、date)和交易记录表(列:Customer_ID、Category、date),你可以根据实际表名调整公式里的引用。
1. 计算每个类别的交易次数
在总消费表里新增7列,分别对应类别1到7的交易次数。比如类别1的交易次数列(D列),输入以下公式后下拉填充:
=COUNTIFS(交易记录表!$A:$A, $A2, 交易记录表!$B:$B, 1, 交易记录表!$C:$C, "<"&$C2)
公式解释:用
COUNTIFS多条件计数,同时匹配客户ID一致、类别为1、交易日期早于当前行日期这三个条件,统计符合条件的记录数。
要计算类别2-7的次数,只需要把公式里的1改成对应的类别数字即可。
2. 获取每个类别的最后交易日期
同样在总消费表新增7列对应类别1到7的最后交易日期,比如类别1的最后日期列(K列),输入公式后下拉:
=IF(MAXIFS(交易记录表!$C:$C, 交易记录表!$A:$A, $A2, 交易记录表!$B:$B, 1, 交易记录表!$C:$C, "<"&$C2)=0, "", MAXIFS(交易记录表!$C:$C, 交易记录表!$A:$A, $A2, 交易记录表!$B:$B, 1, 交易记录表!$C:$C, "<"&$C2))
公式解释:先用
MAXIFS找出符合条件的最大日期(也就是最后交易日期),如果没有符合条件的记录会返回0,再用IF把0转换成空值,看起来更干净。
同理,替换公式里的1为2-7,就能得到其他类别的最后交易日期。
拆分表格(可选)
如果要拆成「有交易的类别统计」和「无交易的类别统计」两张表,可以用Excel的筛选功能:
- 筛选交易次数列中任意一列大于0的行,复制到新表就是有交易的记录;
- 筛选所有交易次数列都为0的行,复制到另一张表就是无交易的记录。
如果你用的是Excel 365/2021,还可以用FILTER函数自动生成:
有交易的表公式:
=FILTER(总消费表!A:Q, (总消费表!D:D>0)+(总消费表!E:E>0)+(总消费表!F:F>0)+(总消费表!G:G>0)+(总消费表!H:H>0)+(总消费表!I:I>0)+(总消费表!J:J>0)>0)
无交易的表公式:
=FILTER(总消费表!A:Q, (总消费表!D:D=0)*(总消费表!E:E=0)*(总消费表!F:F=0)*(总消费表!G:G=0)*(总消费表!H:H=0)*(总消费表!I:I=0)*(总消费表!J:J=0))
二、Power Query实现(适合数据量大、需要自动化更新的情况)
如果你的数据量很大,用函数会卡顿,或者需要后续自动更新统计结果,Excel自带的Power Query工具就很合适,步骤如下:
- 导入数据到Power Query:选中每张表,点击「数据」选项卡→「从表格/区域」,分别把两张表导入到Power Query编辑器。
- 预处理交易记录表:按
Customer_ID和Category分组,添加两个聚合列:「交易次数」用Count统计日期,「最后交易日期」用Max取最大日期。 - 合并两张表并过滤日期:回到总消费表的查询,点击「合并查询」→「合并为新查询」,选择交易记录表,匹配条件为
Customer_ID相等;合并后展开数据时,添加筛选条件:只保留交易日期早于总消费表当前行日期的记录。 - 透视类别列:把
Category列透视成表头,分别对应「交易次数」和「最后交易日期」,空值可以替换成「无交易」或者空字符串。 - 加载回Excel:点击「关闭并上载」,得到处理好的表,后续数据更新时,只要右键点击表选择「刷新」就能自动更新统计结果。
是否需要其他工具?
如果数据量特别大(比如几十万行),Excel本身的功能可能有点吃力,这时候可以用Python的pandas库来处理,核心代码思路如下:
import pandas as pd # 读取两张表 df_total = pd.read_excel('你的文件路径.xlsx', sheet_name='总消费表') df_trans = pd.read_excel('你的文件路径.xlsx', sheet_name='交易记录表') # 转换日期格式 df_total['date'] = pd.to_datetime(df_total['date'], format='%d.%m.%Y') df_trans['date'] = pd.to_datetime(df_trans['date'], format='%d.%m.%Y') # 遍历总消费表的每一行,计算对应统计值 result_list = [] for _, total_row in df_total.iterrows(): cust_id = total_row['Customer_ID'] target_date = total_row['date'] # 筛选该客户且交易日期早于目标日期的记录 filtered_trans = df_trans[(df_trans['Customer_ID'] == cust_id) & (df_trans['date'] < target_date)] # 按类别分组统计 if not filtered_trans.empty: group_stats = filtered_trans.groupby('Category').agg( 交易次数=('date', 'count'), 最后交易日期=('date', 'max') ).unstack() # 重命名列名 group_stats.columns = [f'类别{cat}_{stat}' for stat, cat in group_stats.columns] # 合并原行数据和统计结果 combined_row = pd.concat([total_row, group_stats], axis=0) else: # 无交易时给7个类别填充默认值 combined_row = total_row.copy() for cat in range(1, 8): combined_row[f'类别{cat}_交易次数'] = 0 combined_row[f'类别{cat}_最后交易日期'] = pd.NaT result_list.append(combined_row) # 生成最终结果表并保存 final_df = pd.DataFrame(result_list) final_df.to_excel('统计结果表.xlsx', index=False)
不过日常处理的话,Excel自带的函数或者Power Query完全够用,不需要额外安装工具。
内容的提问来源于stack exchange,提问作者John




