我试图找出一个类别中超过80 %(阈值)的商品的“最快”数量,以及一个类别中低于80 %(阈值)的商品数量。
下面是原始数据集。
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)。
Category Number of item *above threshold
0001 3
对于0001类,达到80 %阈值的“最快”项目数为3,即1000、1003、1007,总数为900 (400 + 300 + 200)。
低于总销售额的80% (阈值) (860)。
Category Number of item *below threshold
0001 7
对于0001类,低于80 %阈值的项目数为7,即1001,1002,1004,1005,1006,1008,1009。
我不确定这是否可以通过基于集合的解决方案来实现,这些解决方案看起来需要迭代才能找到在80 %以上和80%以下的销售门槛范围内最快的商品数量。
我可以找出类别的总销售额,因此占总销售额的80 %,但我很难找到一个类别中超过总销售额80 %(阈值)的“最快”的商品数量。有人知道怎么做吗?
如果你需要更多的细节,请告诉我。
你好,迈克
发布于 2015-08-11 03:40:51
一个应该适用于几乎任何DMBS的解决方案(在MySQL和甲骨文上测试过,也适用于PostgreSQL、Server和SQLite,但您必须注意不要使用整数除法,这样就可以将累积销售额乘以1.0,从而使其真正在所有DMBS上运行):
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
;
发布于 2015-08-11 03:34:20
如果您使用的是Server 2012+:
SQL Fiddle
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
结果
| Category | above | below |
|----------|-------|-------|
| 0001 | 3 | 7 |
https://stackoverflow.com/questions/31932420
复制相似问题