MS Access:Rank SUM()值

时间:2012-12-13 19:54:19

标签: ms-access-2007

我正在使用仍在使用MS Access作为其数据源的旧网络应用程序,并且在尝试对SUM()值进行排名时遇到了问题。

假设我有2个不同的帐号,每个帐号都有未知数量的发票。我需要总结所有发票的总数,按帐号对其进行分组,然后添加等级(1-2)。

RAW TABLE EXAMPLE ...

帐户|销售|发票编号
001 | 400 | 123个
002 | 150 | 456个
001 | 300 | 789个

期望的结果......

帐户|销售|排名
001 | 700 | 1
002 | 150 | 2个

我试过......

SELECT帐户,SUM(销售)AS Sales,      (从发票中选择COUNT(*))AS RANK 从发票 按帐户排序

但该查询会不断返回分配给该帐户的记录数,而不是排名。

3 个答案:

答案 0 :(得分:0)

报告中这会更容易,运行次数为Report - Running Count within a Group

这在查询中不是标准的,但您可以使用自定义函数执行某些操作(它很复杂,但可能): http://support.microsoft.com/kb/94397/en-us

答案 1 :(得分:0)

最简单的方法是将其分解为2个查询,第一个是这个,我将其保存为 qryInvoices

SELECT Invoices.Account, Sum(Invoices.Sales) AS Sales
FROM Invoices
GROUP BY Invoices.Account;

然后第二个查询使用第一个查询如下:

SELECT qryInvoices.Account, qryInvoices.Sales, (SELECT Count(*) FROM qryInvoices AS I WHERE I.Sales > qryInvoices.Sales)+1 AS Rank
FROM qryInvoices
ORDER BY qryInvoices.Sales DESC;

我已经对此进行了测试,并得到了问题中所述的预期结果。

注意:可以使用定义的表在一个查询中实现,但在这种情况下,它看起来有点难看。

答案 2 :(得分:0)

如果您在一个查询中需要答案,那么它应该是

SELECT inv.*, ( 
    SELECT 1+COUNT(*) FROM (
        SELECT Account, Sum(Sales) AS Sum_sales FROM Invoices GROUP BY Account
    ) WHERE Sum_sales > inv.Sum_sales
) AS Rank
FROM (
    SELECT Account, Sum(Sales) AS Sum_sales  FROM Invoices GROUP BY Account
) inv

我在Access上尝试过它,但它确实有效。您也可以为上面的两个“Sum_sales”实例使用不同的名称以避免混淆(在这种情况下,您可以删除“inv。”前缀)。