如何根据月份动态生成列名?
在一个DB2数据库里有一张表,长成如下:
| 客户ID | 日期 | 月 | 年 | 分类 | 花费 |
|---|---|---|---|---|---|
| 111 | 2026-06-03 | 06 | 2026 | A | 10 |
| 111 | 2026-06-01 | 06 | 2026 | A | 15 |
| 111 | 2026-06-01 | 06 | 2026 | B | 20 |
| 111 | 2026-05-01 | 05 | 2026 | A | 10 |
| 111 | 2025-12-01 | 12 | 2025 | A | 10 |
| 222 | 2026-06-03 | 06 | 2026 | A | 10 |
我想把每种类别、月份和年份的组合对应的月度花费都列出来,像这样:
| 客户ID | A_spend_2025_12 | A_spend_2026_05 | A_spend_2026_06 | B_spend_2026_06 |
|---|---|---|---|---|
| 111 | 10 | 10 | 25 | 20 |
| 222 | 0 | 0 | 10 | 0 |
该怎么做才最合适?我可以使用SQL和 Python。
我目前能想到的最佳方案是像下面这样使用 CASE WHEN。不过把这些值硬编码在代码里意味着每次重新运行时都需要更新(这是按需运行以覆盖最近24个月数据的场景)。
SELECT CUSTOMER_ID,
SUM(CASE WHEN CATEGORY = 'A' AND YEAR = '2025' AND MONTH = '06' THEN SPEND ELSE 0 END) AS A_SPEND_2025_12,
SUM(CASE WHEN CATEGORY = 'A' AND YEAR = '2026' AND MONTH = '05' THEN SPEND ELSE 0 END) AS A_SPEND_2026_05,
SUM(CASE WHEN CATEGORY = 'A' AND YEAR = '2026' AND MONTH = '06' THEN SPEND ELSE 0 END) AS A_SPEND_2026_06,
SUM(CASE WHEN CATEGORY = 'B' AND YEAR = '2026' AND MONTH = '06' THEN SPEND ELSE 0 END) AS B_SPEND_2026_06
FROM MY_TABLE
GROUP BY CUSTOMER_ID
解决方案
在Python中,似乎很容易使用 pandas 进行数据透视,如下所示:
import pandas as pd
# df = <read your data>
res = df.pivot_table(values="spend",
index=["category", "year", "month"],
columns = "customer_id", aggfunc="sum").T.fillna(0)
res.columns = ["{}_spend_{}_{}".format(i, j, k) for i, j, k in res.columns]
结果:
A_spend_2025_12 A_spend_2026_5 A_spend_2026_6 B_spend_2026_6
customer_id
111 10.0 10.0 25.0 20.0
222 0.0 0.0 10.0 0.0
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。