ARTICLE · 1191099
利用DuckDBExcelAddin插件进行季度回款求和

我们首先来看一下要求和的数据和结果吧:

这个问题,使用普通公式或是数据透视表都能够解决。不过,既然我们现在聊到了 DuckDBExcelAddin 这款插件,那我们就自然而然地要用这款插件来处理该问题。
公式是直接写在F1单元格中的:
=DUCKDB.EXEC("select * exclude 顺序 replace (if(姓名=lag(姓名) over (),'',姓名) as 姓名)from (select min(ordinality) as 顺序,姓名,quarter(xldate(月份))||'季度' as 季度,sum(columns('款'))from xlrange(1) with ordinalitygroup by 姓名,季度 order by 顺序)",A1:D28)
公式的主要功能:
将以月份为单位的明细数据(如A1:D28 的每人每月回款数据)按【季度】进行汇总,并对姓名进行视觉优化:同姓名只在第一行显示一次,其余留空。
详细解释:
1、核心架构:
使用=DUCKDB.EXEC("SQL 查询语句", 数据范围) 的结构,将 Excel 中的A1:D28 区域作为数据源输入到 DuckDB 中进行处理。
2、内层子查询:数据聚合与转换
xlrange(1) with ordinality:读取输入的 Excel 范围,并透过 with ordinality 自动为每一行数据生成一个行号索引,用来在聚合后维持原本的先后排序。
quarter(xldate(月份))||'季度':将字段中的月份文字转换为日期格式,接着用 quarter() 函数提取出所属的季度(1、2、3、4),最后透过字符串拼接符号 || 加上 '季度' 变成1季度、2季度、3季度、4季度。
sum(columns('款')):使用 DuckDB 的动态字段选取功能 columns,自动选取所有包含“款”字的字段,并在群组后自动进行加总求和。
group by 姓名, 季度 order by顺序:依据“姓名”与计算出的“季度”进行分组汇总,并依照原本数据出现的先后顺序进行排序。
3、外层查询:视觉美化与调整
exclude 顺序:选择内层查询出来的所有字段,但透过 exclude 顺序 把刚刚用来排序的辅助字段“顺序”隐藏掉,不在最终的 Excel 画面上显示。
replace (if(姓名=lag(姓名) over (), '', 姓名) as 姓名):
这是一个非常巧妙的报表排版技巧。lag(姓名) over () 会取得上一行的姓名。
if(...) 判断:如果当前行的姓名跟上一行相同,就用空字符串 '' 取代;如果不同,则保留原姓名。这就达成了表格中常见的“相同姓名合并显示/只在第一行出现”的视觉效果。
今天的分享就到这儿啦,非常感谢您对“Python SQL审天下”公众号的关注和点赞。如果您觉得我的公众号能给您带来一丝丝的收获,请多多转发给您的朋友圈,让更多的人看到并了解。也许您不经意间的点赞和转发,会给他人带来独特的体验和感受。















































































