2

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

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

原始表示例...

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

期望的结果...

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

我试过了...

SELECT Account, SUM(Sales) A​​S Sales, (SELECT COUNT(*) FROM Invoices) A​​S RANK FROM Invoices ORDER BY Account

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

4

3 回答 3

0

这在带有运行计数的报告中会更容易:报告 - 组内的运行计数

这在查询中不是标准的,但您可以使用自定义函数做一些事情(它很精细,但可能):http: //support.microsoft.com/kb/94397/en-us

于 2012-12-14T11:47:35.940 回答
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;

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

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

于 2012-12-14T14:00:12.133 回答
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.”前缀)。

于 2013-01-11T09:58:11.040 回答