You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

SQL收入分析:按产品拆分收入并计算销售额占比的技术咨询

SQL收入分析:按产品拆分收入并计算销售额占比的技术咨询

嘿,看你已经做了不少尝试啦——先是用窗口函数拿到了年度总销售额,又试着按产品分组统计销售数据,现在就差把这俩结果结合起来算出每个产品的销售额占比了,我来帮你捋一捋!

首先得修正你第二个查询里的小问题:你在GROUP BY里写了so_date,这会导致数据按每一天分组,而不是按年份,所以得改成to_char(so_date, 'YYYY')才能得到每个产品每年的总销售额。

接下来,计算占比的核心思路是:把每个产品的年度销售额,除以当年的总销售额,再乘以100转换成百分比。我们可以直接在同一个查询里用窗口函数来获取年度总销售额,不用单独写子查询,这样更简洁。

给你整理好的SQL语句:

SELECT
    pro_id,
    pro_name,
    to_char(so_date, 'YYYY') AS year,
    SUM(SOD_QTY * SOD_PRICE_UNIT) AS product_sales,
    -- 计算当年的总销售额:对分组后的产品销售额再做一次年度维度的求和
    SUM(SUM(SOD_QTY * SOD_PRICE_UNIT)) OVER (PARTITION BY to_char(so_date, 'YYYY')) AS annual_total_sales,
    -- 计算占比,保留两位小数
    ROUND(
        (SUM(SOD_QTY * SOD_PRICE_UNIT) / SUM(SUM(SOD_QTY * SOD_PRICE_UNIT)) OVER (PARTITION BY to_char(so_date, 'YYYY'))) * 100,
        2
    ) AS sales_percentage
FROM all_sales
GROUP BY pro_id, pro_name, to_char(so_date, 'YYYY')
ORDER BY year, pro_id;

我来拆解一下关键部分:

  • SUM(SOD_QTY * SOD_PRICE_UNIT):这就是你要的每个产品每年的销售额,命名为product_sales
  • SUM(SUM(...)) OVER (PARTITION BY to_char(so_date, 'YYYY')):这里用了嵌套的SUM,因为外层已经是分组后的结果,窗口函数需要对这些分组后的聚合值再做一次年度维度的求和,这样就能得到当年的总销售额annual_total_sales
  • 最后一行的ROUND(...):用产品销售额除以年度总销售额,乘以100转成百分比,再用ROUND保留两位小数,结果看起来更清晰

举个例子,比如你之前拿到的2023年总销售额是33962.8,如果某个产品当年的销售额是5000,那占比就是(5000/33962.8)*100 ≈ 14.72%,这个查询会直接帮你算出这个数值。

这样执行后,你就能得到每个产品每年的销售额、当年总销售额,以及该产品销售额在当年的占比啦!

备注:内容来源于stack exchange,提问作者Jessica J

火山引擎 最新活动