基于Table1选中产品生成Table2产品销售汇总的实现方案咨询
现有数据表格
Table1:选中产品列表
| line | product |
|---|---|
| 1 | a |
| 2 | b |
| 3 | d |
Table2:产品销售数据
| a | b | c | d |
|---|---|---|---|
| l | s | m | xs |
| xs | s | xs | m |
| m | xl | s | l |
| xs | xl | m | xl |
| xs | xl | l | s |
| xs | m | xl | l |
| m | m | l | l |
| s | m | m | l |
需求说明
基于Table1中的选中产品(a、b、d),汇总Table2中对应产品的各尺码出现次数,生成包含product、sizes、qty的汇总表,预期结果如下:
预期结果表
| product | sizes | qty |
|---|---|---|
| a | l | 1 |
| a | xs | 4 |
| a | m | 2 |
| a | s | 1 |
| b | s | 2 |
| b | xl | 3 |
| b | m | 3 |
| d | xs | 1 |
| d | m | 1 |
| d | l | 4 |
| d | xl | 1 |
| d | s | 1 |
技术方案建议
方案1:SQL实现(数据库存储场景)
如果数据存在数据库中,通过列转行+关联筛选+分组统计实现:
- 将Table2的列结构转为行结构,把每个产品的尺码拆成单独行记录
- 关联Table1筛选出选中的产品
- 按产品和尺码分组统计数量
示例SQL代码(MySQL环境,用UNION ALL模拟列转行):
SELECT t.product, t.size AS sizes, COUNT(*) AS qty FROM ( SELECT 'a' AS product, a AS size FROM Table2 UNION ALL SELECT 'b' AS product, b AS size FROM Table2 UNION ALL SELECT 'd' AS product, d AS size FROM Table2 ) t JOIN Table1 ON t.product = Table1.product GROUP BY t.product, t.size ORDER BY t.product, t.size;
方案2:Python Pandas实现(数据分析场景)
用Pandas的melt函数做列转行,再筛选分组统计:
import pandas as pd # 构造数据(实际场景可从文件/数据库读取) table1 = pd.DataFrame({'line': [1,2,3], 'product': ['a','b','d']}) table2 = pd.DataFrame({ 'a': ['l','xs','m','xs','xs','xs','m','s'], 'b': ['s','s','xl','xl','xl','m','m','m'], 'c': ['m','xs','s','m','l','xl','l','m'], 'd': ['xs','m','l','xl','s','l','l','l'] }) # 列转行并筛选选中产品 melted_data = table2.melt(var_name='product', value_name='sizes') selected_products = table1['product'].tolist() filtered_data = melted_data[melted_data['product'].isin(selected_products)] # 分组统计数量 result = filtered_data.groupby(['product', 'sizes']).size().reset_index(name='qty') print(result)
方案3:Excel操作(办公场景)
- 列转行处理:把Table2的a、b、d列分别复制到新工作表的两列,第一列填对应产品名,第二列填尺码数据
- 筛选有效数据:用Table1的产品列表做筛选,只保留a、b、d的记录
- 数据透视表汇总:插入数据透视表,行字段选择
product和sizes,值字段选择sizes并设置为计数
内容的提问来源于stack exchange,提问作者Gulya
相关产品推荐
相关产品推荐

