sql - 退回占客户总销量 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...
解决方案
如果我理解正确,您希望获得能够从所有产品中创造最高 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;
推荐阅读
- html - 如何将文本推送到 flex 的右侧
元素
- javascript - 无法在嵌入式画面中单击() div 元素
- c# - Elasticsearch.net - 范围查询
- javascript - 在 React Context API 中共享类实例是否安全?
- javascript - 如果 POST 路由使用 RegEx,我应该为 HTML 表单设置什么操作属性?
- rx-java2 - 我返回我的模型 null 因为不确定如何等待 Observable 完成 - RxJava RestController
- jmeter - 带有formurlencoded数据请求的apache jmeter帖子失败
- r - 检查数据框中的任何列在 R 中是否相同
- sqlite - GROUP BY 后的总和
- java - C# 中的参数化 System.Type 变量