如何根据月份动态生成列名?

编程语言 2026-07-09

在一个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导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章