优化mysql代码;SELECT 购买渠道,支付年月,子品牌, COUNT(DISTINCT `用户id`)购买人数, SUM( `商品实付金额` ) 购买金额 FROM ( SELECT `购买渠道`,`支付年月`,`子品牌`,`用户id`,`商品实付金额` FROM `valid_order` WHERE `支付日期` > DATE_SUB( '2023-03-31', INTERVAL 12 MONTH ) AND `支付日期` <= '2023-03-31' ) t GROUP BY 1,2,3 UNION ALL SELECT 购买渠道,支付年月,"合计" AS 子品牌, COUNT(DISTINCT `用户id`)购买人数, SUM( `商品实付金额` ) 购买金额 FROM ( SELECT `购买渠道`,`支付年月`,`用户id`,`商品实付金额` FROM `valid_order` WHERE `支付日期` > DATE_SUB( '2023-03-31', INTERVAL 12 MONTH ) AND `支付日期` <= '2023-03-31' ) t GROUP BY 1,2,3 UNION ALL SELECT 购买渠道,"合计" AS 支付年月,子品牌, COUNT(DISTINCT `用户id`)购买人数, SUM( `商品实付金额` ) 购买金额 FROM ( SELECT `购买渠道`,`子品牌`,`用户id`,`商品实付金额` FROM `valid_order` WHERE `支付日期` > DATE_SUB( '2022-03-31', INTERVAL 12 MONTH ) AND `支付日期` <= '2022-03-31' ) t GROUP BY 1,2,3 UNION ALL SELECT 购买渠道, "合计" AS 支付年月, "合计" AS 子品牌, COUNT(DISTINCT `用户id`)购买人数, SUM( `商品实付金额` ) 购买金额 FROM ( SELECT `购买渠道`,`用户id`,`商品实付金额` FROM `valid_order` WHERE `支付日期` > DATE_SUB( '2022-03-31', INTERVAL 2 MONTH ) AND `支付日期` <= '2022-03-31' ) t GROUP BY 1,2,3;
时间: 2023-07-13 21:28:27 浏览: 65
这个SQL查询语句可以进行如下优化:
1. 将日期范围的判断条件提前到子查询中,避免在主查询中重复判断日期条件。
2. 将子查询中的字段选取尽量简化,只选取必要的字段,避免不必要的数据传输和内存开销。
3. 可以考虑将子查询中的 `DISTINCT` 去掉,改为使用 `GROUP BY` 去重,因为 `DISTINCT` 会产生额外的内存开销。
下面是优化后的SQL查询语句:
```
SELECT
购买渠道,
支付年月,
子品牌,
COUNT(DISTINCT 用户id) 购买人数,
SUM(商品实付金额) 购买金额
FROM (
SELECT
购买渠道,
支付年月,
子品牌,
用户id,
商品实付金额
FROM
valid_order
WHERE
支付日期 > DATE_SUB('2023-03-31', INTERVAL 12 MONTH)
AND 支付日期 <= '2023-03-31'
UNION ALL
SELECT
购买渠道,
'合计' AS 支付年月,
'合计' AS 子品牌,
用户id,
商品实付金额
FROM
valid_order
WHERE
支付日期 > DATE_SUB('2022-03-31', INTERVAL 2 MONTH)
AND 支付日期 <= '2022-03-31'
) t
GROUP BY
购买渠道,
支付年月,
子品牌 WITH ROLLUP;
```
其中,`WITH ROLLUP` 可以用来实现对行分组后的列汇总。
阅读全文