如何合并两个SQL查询,一次性获取产品明细及对应月度销售数据
SQL合并方案
可以通过LEFT JOIN关联预聚合的销售数据,实现单次查询拿到所有产品明细和对应销售数据,无需循环查询,合并后的语句如下:
SELECT p.*, -- 无销售记录时默认返回0可替换为下面两行 -- COALESCE(s.items, 0) AS items, -- COALESCE(s.orders, 0) AS orders s.items, s.orders FROM products p LEFT JOIN ( -- 先聚合指定时间范围的所有销售数据,减少关联数据量 SELECT sku, SUM(amount) AS items, SUM(ARRAY_LENGTH(list, 1)) AS orders FROM orders_summary WHERE order_date BETWEEN to_timestamp(1633148000000 / 1000.0) AND to_timestamp(1633676400000 / 1000.0) -- 同门店过滤,缩小子查询范围提升效率 AND store_id = 'ca4172e9-5627-4867-884d-d731895c33fe' GROUP BY sku ) s ON p.sku = s.sku WHERE p.store_id = 'ca4172e9-5627-4867-884d-d731895c33fe';
逻辑说明
- 采用子查询先完成销售数据的聚合计算,再和产品表关联,避免关联后聚合出现数据重复的问题
- 使用LEFT JOIN保证没有对应时间段销售记录的产品,也能正常返回产品明细,仅销售字段返回NULL,可通过
COALESCE函数将NULL转换为0 - 子查询中增加同门店过滤条件,减少不必要的计算量,查询性能更高
- products表的sku有唯一约束,关联后不会出现产品行重复的问题
内容的提问来源于stack exchange,提问作者Mj Ebrahimzadeh
相关产品推荐
相关产品推荐

