0

我看到有人发布了与我希望在 Access 2010 中执行的操作非常相似的内容。

前 80% 类别的分组

我看到了回复,但对使用的命名法和分配的标题感到困惑。我有 5 个供应商提供产品。我只关心前 80% 作为帕累托分布,其余的可以归类为“其他”

4 个供应商作为字段 [供应商]:A1、A2、A3、A4

4 个值作为字段 [Lbs]:4000、5000、200、800

查询返回:A1、A2、其他

感谢任何人都可以提供的任何帮助。

4

1 回答 1

2

在执行这样的计算时,我们需要注意出现平局时会发生什么,所以让我们使用以下 [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
于 2013-11-12T10:28:24.147 回答