Oracle SQL:透视股票价格表时保留空值的实现方法求助
实现股票价格表的透视转换(保留空值)
需求说明
你有一张按日期排序的股票价格表,包含A、B、C、D、E五只股票的数百条日期数据,需要将其透视转换为日期作为行、股票代码作为列的格式,同时保留原数据中的空值(比如示例中B股票在01/10/22的缺失值)。
原数据格式
Date |Stock| Price | 30/09/22 | A | 100.5 | 30/09/22 | B | 151.3 | 30/09/22 | C | 233.4 | 30/09/22 | D | 237.2 | 30/09/22 | E | 38.42 | 01/10/22 | A | 101.5 | 01/10/22 | B | ----- | 01/10/22 | C | 237.6 | 01/10/22 | D | 232.2 | 01/10/22 | E | 38.54 |
期望结果格式
Date | A | B | C | D | E | 30/09/22 |100.5|151.3|233.4|237.2|38.42| 01/10/22 |101.5|-----|237.6|232.2|38.54|
实现方案
1. 使用Excel实现
Excel的透视表功能可以直接完成转换,关键是设置空值保留:
- 选中整个数据区域,点击插入 → 透视表,选择透视表放置位置。
- 在透视表字段列表中:
- 将
Date拖到行区域 - 将
Stock拖到列区域 - 将
Price拖到值区域,右键点击值字段选择值字段设置,选择求和(因每个日期+股票组合仅一条数据,求和不会改变数值)。
- 将
- 保留空值:右键透视表 → 透视表选项 → 在布局和格式标签下,取消勾选对于空单元格显示(或自定义显示
-----)。
2. 使用Python Pandas实现
针对数百条日期的大数据量,Python处理更高效,代码示例如下:
import pandas as pd # 构造或读取原数据(此处为示例构造,实际可通过pd.read_csv读取文件) df = pd.DataFrame({ 'Date': ['30/09/22', '30/09/22', '30/09/22', '30/09/22', '30/09/22', '01/10/22', '01/10/22', '01/10/22', '01/10/22', '01/10/22'], 'Stock': ['A', 'B', 'C', 'D', 'E', 'A', 'B', 'C', 'D', 'E'], 'Price': ['100.5', '151.3', '233.4', '237.2', '38.42', '101.5', '-----', '237.6', '232.2', '38.54'] }) # 执行透视转换 pivot_df = df.pivot(index='Date', columns='Stock', values='Price').reset_index() # 移除列名的层级标签,让格式更简洁 pivot_df.columns.name = None # 打印结果 print(pivot_df.to_string(index=False))
这段代码会生成符合要求的透视表,且原数据中的-----空值会被完整保留。
内容的提问来源于stack exchange,提问作者Guillem
相关产品推荐
相关产品推荐

