SQL如何通过子查询合并操作计算各类商品销量占总销量的百分比
合并为单条SQL的实现方法
你可以直接把第一步的分组统计查询作为子查询,嵌套到第二步的FROM子句中即可,逻辑和你分两步执行完全一致,写法如下:
SELECT *, ROUND(CAST(sold_shoes AS FLOAT)/CAST(sold_total AS FLOAT)*100,2) AS sold_shoes_perc, ROUND(CAST(sold_gloves AS FLOAT)/CAST(sold_total AS FLOAT)*100,2) AS sold_gloves_perc, ROUND(CAST(sold_trousers AS FLOAT)/CAST(sold_total AS FLOAT)*100,2) AS sold_trousers_perc FROM ( SELECT stores, SUM(shoes) AS sold_shoes, SUM(gloves) AS sold_gloves, SUM(trousers) AS sold_trousers, SUM(shoes) + SUM(gloves) + SUM(trousers) AS sold_total FROM t GROUP BY stores ) AS t_new
如果你的数据库支持CTE(公用表表达式,MySQL 8.0+、PostgreSQL、SQLite、SQL Server等主流数据库均支持),也可以用CTE写法,逻辑分层更清晰,后续调整更方便:
WITH t_new AS ( SELECT stores, SUM(shoes) AS sold_shoes, SUM(gloves) AS sold_gloves, SUM(trousers) AS sold_trousers, SUM(shoes) + SUM(gloves) + SUM(trousers) AS sold_total FROM t GROUP BY stores ) SELECT *, ROUND(CAST(sold_shoes AS FLOAT)/CAST(sold_total AS FLOAT)*100,2) AS sold_shoes_perc, ROUND(CAST(sold_gloves AS FLOAT)/CAST(sold_total AS FLOAT)*100,2) AS sold_gloves_perc, ROUND(CAST(sold_trousers AS FLOAT)/CAST(sold_total AS FLOAT)*100,2) AS sold_trousers_perc FROM t_new
内容的提问来源于stack exchange,提问作者ConcreteJungle
相关产品推荐
相关产品推荐

