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

PostgreSQL中关联表并使用HAVING子句时如何正确统计数据?

问题分析与修正

你的SQL存在两个关键错误,导致结果不符合预期:

  • 关联字段错误:两张表的关联字段是customerid,而非id,原语句里的c.id = t.id无法正确关联客户与交易记录,自然查不到客户1的数据。
  • 未筛选1月份交易:需求明确要统计1月份的购买总额,但原语句没有过滤日期,会把所有月份的交易都纳入计算,既不符合需求,还可能引入错误数据。

修正后的SQL语句

SELECT
    c.firstname,
    c.lastname,
    SUM(t.purchase) AS total_purchase
FROM
    customer c
    INNER JOIN trans t ON c.customerid = t.customerid
WHERE
    -- 筛选2021年1月份的交易,先将字符串格式日期转为DATE类型再判断
    EXTRACT(YEAR FROM t.pdate::DATE) = 2021
    AND EXTRACT(MONTH FROM t.pdate::DATE) = 1
GROUP BY
    c.customerid, c.firstname, c.lastname
HAVING
    SUM(t.purchase) > 500;

关键修正说明

  1. 关联字段修正:将c.id = t.id改为c.customerid = t.customerid,确保客户表与交易表通过正确字段关联。
  2. 日期筛选:通过EXTRACT函数提取年份和月份,精准筛选2021年1月的交易;由于pdate是DD-MM-YYYY格式的字符串,需先通过::DATE转换为日期类型再处理。
  3. 分组优化:分组时加入c.customerid,避免出现重名客户导致分组错误的情况(当前数据无此问题,但写法更严谨)。
  4. 结果别名:给SUM计算结果起别名total_purchase,让输出结果更清晰易读。

执行该语句后,将得到客户1(Raj Sharma,总额600)和客户3(Riya Sen,总额600)的符合要求的数据。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 00:40:59