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

编写聚合SQL查询:计算各门店销售额占总销售额的百分比

解决方案:添加门店销售额占比列

没问题,这个需求用SQL就能轻松实现,我给你两种可行的方案,适配不同的数据库环境:

方案1:使用窗口函数(推荐,支持PostgreSQL、MySQL 8.0+、SQL Server等)

窗口函数可以直接在分组查询中计算全局的总销售额,代码简洁高效:

SELECT 
    store,
    SUM(sales) AS total_sales,
    bill_date,
    -- 计算占比并保留两位小数
    ROUND(
        (SUM(sales) / SUM(SUM(sales)) OVER ()) * 100,
        2
    ) AS sales_percentage
FROM sales 
WHERE bill_date = '2018-01-01'  -- 修正原SQL的字段名不一致问题(原WHERE用date,结果用bill_date)
GROUP BY store, bill_date;

代码解释:

  • SUM(sales):计算每个门店当天的销售额总和,别名total_sales方便阅读;
  • SUM(SUM(sales)) OVER ():内层SUM(sales)是分组后的门店销售额,外层的窗口函数OVER ()会计算整个结果集的总销售额(即当天所有门店的销售额总和);
  • ROUND(..., 2):将百分比结果保留两位小数,你可以根据需求调整小数位数(比如改成0就是整数百分比)。

预期查询结果:

storetotal_salesbill_datesales_percentage
Store A1002018-01-0120.24
Store B1232018-01-0124.89
Store C1302018-01-0126.31
Store D1132018-01-0122.56

(注:总销售额为100+123+130+113=466,占比计算为「门店销售额/466*100」)

方案2:使用子查询(兼容老版本数据库,比如MySQL 5.x)

如果你的数据库不支持窗口函数,可以用子查询先计算当天的总销售额,再关联计算占比:

SELECT 
    s.store,
    SUM(s.sales) AS total_sales,
    s.bill_date,
    ROUND(
        (SUM(s.sales) / (SELECT SUM(sales) FROM sales WHERE bill_date = '2018-01-01')) * 100,
        2
    ) AS sales_percentage
FROM sales s
WHERE s.bill_date = '2018-01-01'
GROUP BY s.store, s.bill_date;

代码解释:

  • 子查询(SELECT SUM(sales) FROM sales WHERE bill_date = '2018-01-01'):单独计算当天所有门店的总销售额;
  • 后续逻辑和方案1一致,用门店销售额除以总销售额得到百分比。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:04:31