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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 13:09:56