销售数据分析:计算各产品占总销售额的百分比

问题描述 投票:0回答:1

假设我有以下产品销售数据:

产品:

产品_id 产品名称 类别_id
1 小工具A 1
2 小部件B 1
3 小发明 2
4 小工具 2
5 杜希基 3

类别:

类别_id 类别名称
1 电子
2 玩具
3 家居与花园

销售:

销售_id 产品_id 数量 销售日期 销售价格
101 1 10 2024-04-01 19.99
102 2 5 2024-04-02 24.99
103 3 7 2024-04-03 15.99
104 4 4 2024-04-04 20.99
105 5 3 2024-04-05 29.99

我现在想知道每种产品的销售额及其占总销售额的百分比。

我尝试了下面的查询,得到了预期的结果,但是我觉得执行时间有点长,特别是当表变大时,有什么可以优化的吗?(顺便说一句,我使用的是PieCloudDB数据库,如果你不知道你可以用 PostgreSQL 来测试。)

提前感谢您的帮助

WITH TotalSales AS (
    SELECT SUM(sale_price * quantity) AS overall_sales
    FROM sales
),
CategorySales AS (
    SELECT
        c.category_name,
        p.product_name,
        SUM(s.sale_price * s.quantity) AS category_sales
    FROM sales s
    JOIN products p ON s.product_id = p.product_id
    JOIN categories c ON p.category_id = c.category_id
    CROSS JOIN TotalSales
    GROUP BY c.category_name, p.product_id, p.product_name
)
SELECT
    product_name,
    category_name,
    category_sales,
    ROUND((category_sales * 100.0) / overall_sales, 2) AS percentage_of_total
FROM CategorySales, TotalSales
ORDER BY category_sales DESC;
sql query-optimization
1个回答
0
投票

我在PostgreSQL中用你的示例数据进行了测试,下面的查询的执行时间比你的方法要快(但我不能保证它适用于你的PieCloudDB),你可以尝试一下, 希望对你有帮助。

SELECT c.category_name, p.product_name, SUM(s.quantity * s.sale_price) AS total_category_sales, ROUND((SUM(s.quantity * s.sale_price) * 100.0) / (SELECT SUM(sale_price * quantity) FROM sales), 2) AS percentage_of_total
FROM sales s 
JOIN  products p ON s.product_id = p.product_id 
JOIN  categories c ON p.category_id = c.category_id 
GROUP BY c.category_name, p.product_name 
ORDER BY total_category_sales DESC;
© www.soinside.com 2019 - 2024. All rights reserved.