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

PostgreSQL嵌套INNER JOIN查询提示列需在GROUP BY子句原因是什么?

PostgreSQL窗口函数语法报错分析

原始报错SQL

SELECT 
    TO_CHAR (o.ShippedDate, 'yyyy.MM') AS Month 
    ,o.OrderID
    ,Total
    ,SUM (Total) OVER PARTITION BY TO_CHAR (ShippedDate, 
    ‘yyyy.MM’) ORDER BY O.OrderID) AS Running_Total 
FROM public.orders O
INNER JOIN (
  SELECT OrderID, SUM(Quantity*UnitPrice) AS Total 
  FROM public.order_details 
  GROUP BY OrderID 
  ORDER BY OrderID
) OD ON O.OrderID = OD.OrderID
WHERE
    TO_CHAR (o.ShippedDate, 'yyyy.MM') IS NOT NULL

报错信息

ERROR: column "o.shippeddate" must appear in the GROUP BY clause or be used in an aggregate function
LINE 2: TO_CHAR (o.ShippedDate, 'yyyy.MM') AS Month

报错原因分析

  • 触发本次报错的核心原因是窗口函数OVER子句缺少左侧括号:SUM (Total) OVER PARTITION BY 应为 SUM (Total) OVER (PARTITION BY,缺失左括号后PostgreSQL无法识别这是窗口函数,会将SUM判定为普通聚合函数,要求所有未聚合的查询字段都加入GROUP BY子句,因此抛出对应错误。
  • 同时还有一处隐藏语法错误:PARTITION BY子句中格式化日期的单引号使用了中文全角符号‘yyyy.MM’,需要替换为英文半角单引号'yyyy.MM',否则后续也会触发解析报错。
  • 冗余提示:内层子查询的ORDER BY OrderID没有实际作用,聚合后的结果顺序不会被外层查询继承,可直接删除。

修复后的可运行参考语句

SELECT 
    TO_CHAR (o.ShippedDate, 'yyyy.MM') AS Month 
    ,o.OrderID
    ,Total
    ,SUM (Total) OVER (PARTITION BY TO_CHAR (ShippedDate, 'yyyy.MM') ORDER BY O.OrderID) AS Running_Total 
FROM public.orders O
INNER JOIN (
  SELECT OrderID, SUM(Quantity*UnitPrice) AS Total 
  FROM public.order_details 
  GROUP BY OrderID
) OD ON O.OrderID = OD.OrderID
WHERE
    TO_CHAR (o.ShippedDate, 'yyyy.MM') IS NOT NULL

内容的提问来源于stack exchange,提问作者Timea Dbs

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 22:57:01