DuckDB中PIVOT用round报错:求原因及聚合列四舍五入方法
问题解答
这是书籍的笔误,和你的DuckDB安装无关。
原因说明
DuckDB的PIVOT语法中,USING子句仅允许直接使用聚合函数(比如sum、max),不能嵌套非聚合的标量函数(比如round)。原书把round放在sum外层的写法违反了这个规则,所以触发round is not an aggregate function错误。
正确写法
有两种可行的修正方式:
方式1:先聚合后透视
先在子查询中完成聚合与四舍五入,再对结果执行透视:
WITH pre_aggregated AS ( SELECT year(day) AS year, round(sum(kWh), 1) AS total, max(kWh) AS best_day FROM v_power_per_day GROUP BY year(day) ) SELECT * FROM pre_aggregated PIVOT ( MAX(total) AS total, MAX(best_day) AS best_day ON year );
方式2:透视后再处理结果
先执行透视得到原始聚合值,再在外层查询中对total列做四舍五入:
SELECT *, round(total_2020, 1) AS total_2020, round(total_2021, 1) AS total_2021 -- 若有更多年份,依次添加对应列的round处理 FROM ( PIVOT v_power_per_day ON year(day) USING sum(kWh) AS total, max(kWh) AS best_day ) AS pivoted_results;
如果需要动态处理所有total_*列(避免手动枚举年份),可以结合DuckDB的information_schema生成SQL,但对新手来说,上述两种静态写法已经足够解决问题。
内容的提问来源于stack exchange,提问作者Apollo42
相关产品推荐
相关产品推荐

