You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Excel基于最近前置日期的VLOOKUP结果筛选及交易关联分析需求

解决Excel两张表匹配并获取类别交易统计的方案

我来帮你梳理下怎么搞定这个需求,分两种场景给你方案,先从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工具就很合适,步骤如下:

  1. 导入数据到Power Query:选中每张表,点击「数据」选项卡→「从表格/区域」,分别把两张表导入到Power Query编辑器。
  2. 预处理交易记录表:按Customer_IDCategory分组,添加两个聚合列:「交易次数」用Count统计日期,「最后交易日期」用Max取最大日期。
  3. 合并两张表并过滤日期:回到总消费表的查询,点击「合并查询」→「合并为新查询」,选择交易记录表,匹配条件为Customer_ID相等;合并后展开数据时,添加筛选条件:只保留交易日期早于总消费表当前行日期的记录。
  4. 透视类别列:把Category列透视成表头,分别对应「交易次数」和「最后交易日期」,空值可以替换成「无交易」或者空字符串。
  5. 加载回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

火山引擎 最新活动