首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >计算超过或低于阈值的项目数

计算超过或低于阈值的项目数
EN

Stack Overflow用户
提问于 2015-08-11 02:50:17
回答 2查看 531关注 0票数 1

我试图找出一个类别中超过80 %(阈值)的商品的“最快”数量,以及一个类别中低于80 %(阈值)的商品数量。

下面是原始数据集。

代码语言:javascript
运行
复制
Category    Items   Sales
0001        1000    400
0001        1001    100
0001        1002    13
0001        1003    300
0001        1004    10
0001        1005    11
0001        1006    12
0001        1007    200
0001        1008    14
0001        1009    15

超过80% (阈值)的总销售额(860)。

代码语言:javascript
运行
复制
Category     Number of item *above threshold
0001         3

对于0001类,达到80 %阈值的“最快”项目数为3,即1000、1003、1007,总数为900 (400 + 300 + 200)。

低于总销售额的80% (阈值) (860)。

代码语言:javascript
运行
复制
Category     Number of item *below threshold
0001         7

对于0001类,低于80 %阈值的项目数为7,即1001,1002,1004,1005,1006,1008,1009。

我不确定这是否可以通过基于集合的解决方案来实现,这些解决方案看起来需要迭代才能找到在80 %以上和80%以下的销售门槛范围内最快的商品数量。

我可以找出类别的总销售额,因此占总销售额的80 %,但我很难找到一个类别中超过总销售额80 %(阈值)的“最快”的商品数量。有人知道怎么做吗?

如果你需要更多的细节,请告诉我。

你好,迈克

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-08-11 03:40:51

一个应该适用于几乎任何DMBS的解决方案(在MySQL和甲骨文上测试过,也适用于PostgreSQL、Server和SQLite,但您必须注意不要使用整数除法,这样就可以将累积销售额乘以1.0,从而使其真正在所有DMBS上运行):

代码语言:javascript
运行
复制
SELECT
   O.Category,
   SUM(CASE WHEN O.CumulativeSales / O.TotalSales < 1 - Thresh THEN 0 ELSE 1 END) Above,
   SUM(CASE WHEN O.CumulativeSales / O.TotalSales < 1 - Thresh THEN 1 ELSE 0 END) Under
FROM
   (SELECT
      T.Category,
      (SELECT
         SUM(Sales)
      FROM
         ...
      WHERE
         Sales <= T.Sales AND Category = T.Category
      ) AS CumulativeSales,
      (SELECT
         SUM(Sales)
      FROM
         ...
      WHERE
         Category = T.Category
      ) AS TotalSales
   FROM
      ... T
   ) O
GROUP BY
   O.Category
;
票数 0
EN

Stack Overflow用户

发布于 2015-08-11 03:34:20

如果您使用的是Server 2012+:

SQL Fiddle

代码语言:javascript
运行
复制
DECLARE @treshold NUMERIC(5, 2) = 0.80;

WITH Cte AS(
    SELECT *,
        ss = SUM(Sales) OVER(PARTITION BY Category ORDER BY Sales DESC)
    FROM tbl
)
SELECT
    c.Category,
    above = n,
    below = c.cnt - n
FROM(
    SELECT 
        Category, 
        cnt = COUNT(*),
        tresh = @treshold * SUM(Sales)
    FROM tbl GROUP BY Category
)c
OUTER APPLY(
    SELECT 
        n = COUNT(*)
    FROM Tbl
    WHERE Category = c.Category
    AND Sales >= (SELECT TOP 1 Sales FROM Cte WHERE ss >= c.tresh)
)a

结果

代码语言:javascript
运行
复制
| Category | above | below |
|----------|-------|-------|
|     0001 |     3 |     7 |
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31932420

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档