You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无分组展示数据且仅在每组首行显示total_amount求和结果求助

需求实现:按分组首行显示金额总和,其余行显示占位符

原始数据

idno_notaitemamounttotal_amount
1pos-001item a2500
2pos-001item b3100
3pos-001item a2200
4pos-002item b5200
5pos-002item a3300
6pos-003item b4300

期望结果

idno_notaitemamounttotal_amount
1pos-001item a25007800
2pos-001item b3100-
3pos-001item a2200-
4pos-002item b52008500
5pos-002item a3300-
6pos-003item b43004300

需求说明

保持原始数据行顺序不变,计算每个no_nota对应的amount总和,仅在每组no_nota的首行显示该总和,同组其余行的total_amount显示为-。


解决方案

1. 使用SQL实现

利用窗口函数计算分组总和,结合行号标记首行,通过条件判断输出对应内容:

SELECT
    id,
    no_nota,
    item,
    amount,
    CASE
        WHEN ROW_NUMBER() OVER (PARTITION BY no_nota ORDER BY id) = 1
        THEN SUM(amount) OVER (PARTITION BY no_nota)
        ELSE '-'
    END AS total_amount
FROM your_table
ORDER BY id;

逻辑说明

  • SUM(amount) OVER (PARTITION BY no_nota):计算每个no_nota分组的金额总和
  • ROW_NUMBER() OVER (PARTITION BY no_nota ORDER BY id):给每个分组内的行按id排序编号
  • CASE语句:仅分组首行显示总和,其余行显示-

2. 使用Python Pandas实现

先计算分组总和,标记非首行记录后填充对应值:

import pandas as pd

# 加载原始数据
df = pd.DataFrame({
    'id': [1,2,3,4,5,6],
    'no_nota': ['pos-001','pos-001','pos-001','pos-002','pos-002','pos-003'],
    'item': ['item a','item b','item a','item b','item a','item b'],
    'amount': [2500,3100,2200,5200,3300,4300]
})

# 生成每个no_nota的分组总和
group_totals = df.groupby('no_nota')['amount'].transform('sum')

# 标记非首行的no_nota记录
is_duplicate = df['no_nota'].duplicated()

# 填充total_amount列
df['total_amount'] = group_totals
df.loc[is_duplicate, 'total_amount'] = '-'

# 输出结果
print(df)

逻辑说明

  • groupby('no_nota')['amount'].transform('sum'):为每行匹配对应分组的总和
  • df['no_nota'].duplicated():返回布尔值标记重复的no_nota行(即非首行)
  • 通过loc将非首行的total_amount替换为-

内容的提问来源于stack exchange,提问作者mansell Senna

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 00:22:13