计算超过和低于阈值的项目数
Calculate number of item over and under threshold
我试图找出 "fastest" 个类别中总销售额超过 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
总销售额 (860) 的 80%(阈值)以上。
Category Number of item *above threshold
0001 3
对于类别 0001,"fastest" 达到 80% 阈值的项目数为 3,即 1000、1003、1007,共计 900 (400 + 300 + 200)。
低于总销售额 (860) 的 80%(阈值)。
Category Number of item *below threshold
0001 7
对于类别0001,低于80%阈值的项目数为7,即1001、1002、1004、1005、1006、1008、1009。
我不确定这是否可以通过基于集合的解决方案实现,这些看起来像是需要迭代才能找到最快超过和低于 80% 销售阈值的项目数量。
我可以找出类别的总销售额,因此占总销售额的 80%,但我很难找出 "fastest" 某个类别中超过 80%(阈值)的商品数量.有人知道怎么做吗?
如果您需要更多详细信息,请告诉我。
此致,
麦克
如果您使用的是 SQL Server 2012+:
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 |
一个应该适用于几乎所有 DMBS 的解决方案(在 MySQL 和 Oracle 上测试,也适用于 PostgreSQL、SQL 服务器和 SQLite,但是你必须注意你没有在那里使用整数除法 [可以将累计销售额乘以 1.0 使其真正 运行 所有这些]):
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
;
我试图找出 "fastest" 个类别中总销售额超过 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
总销售额 (860) 的 80%(阈值)以上。
Category Number of item *above threshold
0001 3
对于类别 0001,"fastest" 达到 80% 阈值的项目数为 3,即 1000、1003、1007,共计 900 (400 + 300 + 200)。
低于总销售额 (860) 的 80%(阈值)。
Category Number of item *below threshold
0001 7
对于类别0001,低于80%阈值的项目数为7,即1001、1002、1004、1005、1006、1008、1009。
我不确定这是否可以通过基于集合的解决方案实现,这些看起来像是需要迭代才能找到最快超过和低于 80% 销售阈值的项目数量。
我可以找出类别的总销售额,因此占总销售额的 80%,但我很难找出 "fastest" 某个类别中超过 80%(阈值)的商品数量.有人知道怎么做吗?
如果您需要更多详细信息,请告诉我。
此致, 麦克
如果您使用的是 SQL Server 2012+:
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 |
一个应该适用于几乎所有 DMBS 的解决方案(在 MySQL 和 Oracle 上测试,也适用于 PostgreSQL、SQL 服务器和 SQLite,但是你必须注意你没有在那里使用整数除法 [可以将累计销售额乘以 1.0 使其真正 运行 所有这些]):
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
;