首页 > 解决方案 > 退回占客户总销量 80% 的顶级产品

问题描述

在 Access 中,我有一个名为“cust_demand”的表,其中包含字段名称客户 ID (str)、产品 ID (str) 和需求 (int)。我正在尝试创建一个查询(或一组查询),它将返回一个包含 80% 客户量的最大产品的列表。

我是这个论坛的新手,所以无法粘贴表格的图像来显示示例输入和所需的输出。所以让我试着用文字来增加一些清晰度。

我本质上是在尝试对我的客户需求集进行帕累托分析。“最大”的产品,是指需求量最大的产品;实际上,这意味着我正在寻找包含 80% 客户需求的最短产品列表。

为了进一步明确,如果 7 种最大的产品占其需求的 79%,而前 8 种产品占其需求的 85%,我想返回 8 种产品的列表。

此外,如果前 5 种产品正好占其需求的 80%,并且第 5 和第 6 大产品的需求完全相同,那么返回的列表应该只返回第 5 或第 6 产品,而不是两者,它是返回哪个并不重要。

我发现这篇文章是关于如何在 python 中做到这一点的。但不确定如何将其转换为 Access 或 SQL。也许我必须学习python...

标签: sqlms-access

解决方案


如果我理解正确,您希望获得能够从所有产品中创造最高 80% 的产品。让我们有一个这样的表:

在此处输入图像描述

这将是您的查询:

    SELECT p.Product,  p.Cust_demand, (SELECT SUM(Cust_demand) FROM Products as p1 WHERE p.Cust_demand <=p1.Cust_demand) AS SumUpToHere,
    (SELECT SUM(Cust_demand) FROM Products as p1 WHERE p.Cust_demand <=p1.Cust_demand) / (SELECT SUM(Cust_demand) FROM Products as p2) * 100  as PercentUpToHere
    FROM Products as p
    WHERE (SELECT SUM(Cust_demand) FROM Products as p1 WHERE p.Cust_demand <=p1.Cust_demand) / (SELECT SUM(Cust_demand) FROM Products as p2) * 100 <=80
    ORDER BY p.Cust_demand DESC;

得到这样的结果: 在此处输入图像描述

唯一的问题是,如果您在顶部有 2 种需求完全相同的产品。这是否会显示它们 - 取决于它们在排序列表中的位置。

如果您不关心 Sums,这是您的查询:

SELECT p.Product,  p.Cust_demand
FROM Products as p
WHERE 
       (SELECT SUM(Cust_demand) FROM Products as p1 WHERE p.Cust_demand <=p1.Cust_demand) 
       / (SELECT SUM(Cust_demand) FROM Products as p2) * 100 <=80
ORDER BY p.Cust_demand DESC;

在此处输入图像描述


推荐阅读