如何在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
相关产品推荐
相关产品推荐

