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

如何在PostgreSQL中通过子查询连接两个独立SELECT语句?

合并查询生成包含年度销售额的结果表

当然可以生成包含ID、姓名、2021销售额、2022销售额的四列表,下面给你两种实现方式,其中第一种符合你想用子查询融入原语句的需求:

方法一:将2022年查询作为子查询关联

把2022年的销售额查询作为子查询,通过customerid和主查询(2021年数据)关联,一次性取出所有需要的字段:

SELECT 
    c.customerid,
    CONCAT(c.firstname, ' ', c.lastname) AS full_name,
    inv2021.total AS "2021 Sales",
    inv2022.total AS "2022 Sales"
FROM customer c
INNER JOIN (
    SELECT customerid, SUM(total) AS total
    FROM invoice
    WHERE YEAR(invoicedate) = 2021
    GROUP BY customerid
) inv2021 ON c.customerid = inv2021.customerid
LEFT JOIN (
    SELECT customerid, SUM(total) AS total
    FROM invoice
    WHERE YEAR(invoicedate) = 2022
    GROUP BY customerid
) inv2022 ON c.customerid = inv2022.customerid;

这里用SUM(total)是因为一个客户可能在同一年有多笔订单,需要汇总年度销售额;如果只需单条记录可以去掉SUM和GROUP BY,但通常销售额统计是年度汇总。另外用YEAR()函数比LIKE '%2021%'更准确,能避免匹配到非2021年的特殊日期格式。

方法二:用条件聚合简化查询

不需要子查询关联,直接在SELECT语句中通过条件判断计算各年度销售额,代码更简洁高效:

SELECT 
    c.customerid,
    CONCAT(c.firstname, ' ', c.lastname) AS full_name,
    SUM(CASE WHEN YEAR(invoicedate) = 2021 THEN i.total ELSE 0 END) AS "2021 Sales",
    SUM(CASE WHEN YEAR(invoicedate) = 2022 THEN i.total ELSE 0 END) AS "2022 Sales"
FROM customer c
INNER JOIN invoice i ON c.customerid = i.customerid
WHERE YEAR(invoicedate) IN (2021, 2022)
GROUP BY c.customerid, full_name;

这种方式通过CASE语句筛选对应年份的销售额并汇总,一次扫描表就能得到结果,性能更优。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 18:45:30