如何将季度周期拆分为单个月份并均分对应USD金额?
将季度PERIOD拆分为月度记录并平均分配USD
原表结构与数据
PERIOD列类型为varchar,格式为YYYY/MM,代表对应季度的最后一个月份(如2021/03是2021年第一季度,2021/06是第二季度):
| PERIOD | YEAR | USD |
|---|---|---|
| 2021/03 | 2021 | 100 |
| 2021/06 | 2021 | 100 |
需求
将每个季度拆分为包含的3个月份,同时将USD金额平均分配到每个月,保留两位小数,得到如下结果:
| PERIOD | YEAR | USD |
|---|---|---|
| 2021/01 | 2021 | 33.33 |
| 2021/02 | 2021 | 33.33 |
| 2021/03 | 2021 | 33.33 |
| 2021/04 | 2021 | 33.33 |
| 2021/05 | 2021 | 33.33 |
| 2021/06 | 2021 | 33.33 |
解决方案
下面提供两种常见数据库的实现方式:
1. MySQL 实现
利用临时数字表生成每个季度对应的3个月份,再与原表关联计算:
WITH nums AS ( SELECT 0 AS n UNION ALL SELECT 1 UNION ALL SELECT 2 ) SELECT DATE_FORMAT( DATE_SUB(STR_TO_DATE(t.PERIOD, '%Y/%m'), INTERVAL n MONTH), '%Y/%m' ) AS PERIOD, t.YEAR, ROUND(t.USD / 3, 2) AS USD FROM your_table t JOIN nums ON n <= (MONTH(STR_TO_DATE(t.PERIOD, '%Y/%m')) - 1) % 3 ORDER BY PERIOD;
2. PostgreSQL 实现
使用generate_series生成月份序列,结合日期函数计算:
SELECT TO_CHAR( (TO_DATE(t.PERIOD, 'YYYY/MM') - INTERVAL '2 months' + (n || ' months')::INTERVAL), 'YYYY/MM' ) AS PERIOD, t.YEAR, ROUND(t.USD / 3, 2) AS USD FROM your_table t JOIN generate_series(0,2) n ON TRUE ORDER BY PERIOD;
说明
- 核心逻辑:先将PERIOD转换为日期类型,再生成该季度对应的3个月份日期,最后格式化为
YYYY/MM字符串; - USD金额通过
ROUND(USD/3,2)实现平均分配并保留两位小数; - 替换
your_table为你的实际表名。
内容的提问来源于stack exchange,提问作者Anonymous
相关产品推荐
相关产品推荐

