我看到有人发布了与我希望在 Access 2010 中执行的操作非常相似的内容。
我看到了回复,但对使用的命名法和分配的标题感到困惑。我有 5 个供应商提供产品。我只关心前 80% 作为帕累托分布,其余的可以归类为“其他”
4 个供应商作为字段 [供应商]:A1、A2、A3、A4
4 个值作为字段 [Lbs]:4000、5000、200、800
查询返回:A1、A2、其他
感谢任何人都可以提供的任何帮助。
我看到有人发布了与我希望在 Access 2010 中执行的操作非常相似的内容。
我看到了回复,但对使用的命名法和分配的标题感到困惑。我有 5 个供应商提供产品。我只关心前 80% 作为帕累托分布,其余的可以归类为“其他”
4 个供应商作为字段 [供应商]:A1、A2、A3、A4
4 个值作为字段 [Lbs]:4000、5000、200、800
查询返回:A1、A2、其他
感谢任何人都可以提供的任何帮助。
在执行这样的计算时,我们需要注意出现平局时会发生什么,所以让我们使用以下 [VendorData]
vendors lbs
------- ----
A1 2000
A2 3000
A3 200
A4 800
A5 2000
A6 2000
我们可以首先在 Access 中创建以下名为 [VendorPct] 的已保存查询
SELECT
vendors,
lbs,
lbs_sum,
lbs / lbs_sum * 100 AS lbs_pct
FROM
(
SELECT vendors, lbs, lbs_sum
FROM
VendorData,
(
SELECT Sum(lbs) AS lbs_sum FROM VendorData
)
)
它给了我们
vendors lbs lbs_sum lbs_pct
------- ---- ------- -------
A1 2000 10000 20
A2 3000 10000 30
A3 200 10000 2
A4 800 10000 8
A5 2000 10000 20
A6 2000 10000 20
现在我们可以在 Access 中创建一个名为 [VendorPctCumulative] 的已保存查询
SELECT
vendors,
Max(lbs) AS lbs_,
Max(lbs_pct) as lbs_pct_,
Sum(lbs_pct_other) AS lbs_pct_cumulative_
FROM
(
SELECT
vendors,
lbs,
lbs_pct,
lbs_pct AS lbs_pct_other
FROM VendorPct
UNION ALL
(
SELECT
v1.vendors,
v1.lbs,
v1.lbs_pct,
v2.lbs_pct AS lbs_pct_other
FROM
VendorPct v1
INNER JOIN
VendorPct v2
ON (v2.lbs = v1.lbs AND v2.vendors < v1.vendors)
OR v2.lbs > v1.lbs
)
)
GROUP BY vendors
ORDER BY Sum(lbs_pct_other), vendors
那产生
vendors lbs_ lbs_pct_ lbs_pct_cumulative_
------- ---- -------- -------------------
A2 3000 30 30
A1 2000 20 50
A5 2000 20 70
A6 2000 20 90
A4 800 8 98
A3 200 2 100
现在又保存了一个名为 [VendorPctCumulativeThreshold] 的查询,用于查找第一个达到或超过 80% 阈值的累积百分比:
SELECT TOP 1 lbs_pct_cumulative_
FROM
(
SELECT lbs_pct_cumulative_
FROM VendorPctCumulative
WHERE lbs_pct_cumulative_ >= 80
ORDER BY lbs_pct_cumulative_
)
IE,
lbs_pct_cumulative_
-------------------
90
我们可以把它们放在一起
SELECT
vendors,
lbs_ AS lbs,
lbs_pct_ AS lbs_pct
FROM
VendorPctCumulative vpc
INNER JOIN
VendorPctCumulativeThreshold vpct
ON vpc.lbs_pct_cumulative_ <= vpct.lbs_pct_cumulative_
UNION ALL
SELECT
"other" AS vendors,
Sum(lbs_) AS lbs,
Sum(lbs_pct_) AS lbs_pct
FROM
VendorPctCumulative vpc
INNER JOIN
VendorPctCumulativeThreshold vpct
ON vpc.lbs_pct_cumulative_ > vpct.lbs_pct_cumulative_
ORDER BY 3 DESC, 1
生产
vendors lbs lbs_pct
------- ---- -------
A2 3000 30
A1 2000 20
A5 2000 20
A6 2000 20
other 1000 10