2

データソースとしてMSAccessを使用している古いWebアプリで作業していますが、SUM()値をランク付けしようとしたときに問題が発生しました。

2つの異なる口座番号があり、それぞれの口座番号に不明な数の請求書があるとします。すべての請求書の合計を合計し、アカウント番号でグループ化してから、ランク(1-2)を追加する必要があります。

RAWテーブルの例...

アカウント| 販売| 請求書番号
001| 400 | 123
002 | 150 | 456
001 | 300 | 789

望ましい結果..。

アカウント| 販売| ランク
001| 700 | 1
002 | 150 | 2

私は試した...

SELECT Account、SUM(Sales)AS Sales、(SELECT COUNT(*)FROM Invoices)AS RANK FROM InvoicesORDERBYアカウント

ただし、そのクエリは、ランクではなく、そのアカウントに割り当てられたレコードの数を返し続けます。

4

3 に答える 3

0

最も簡単な方法は、2つのクエリに分割することです。最初のクエリはこれで、qryInvoicesとして保存しました。

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

次に、2番目のクエリは最初のクエリを次のように使用します。

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;

私はこれをテストし、質問で概説されているように望ましい結果を得ました。

注:Definedテーブルを使用して1つのクエリで実行できる場合もありますが、この場合は少し見苦しく見えました。

于 2012-12-14T14:00:12.133 に答える
0

これは、実行中のカウントを使用したレポートの方が簡単です:レポート - グループ内の実行中のカウント

これはクエリの標準ではありませんが、カスタム関数を使用して何かを行うことができます (精巧ですが可能です): http://support.microsoft.com/kb/94397/en-us

于 2012-12-14T11:47:35.940 に答える
0

1 つのクエリで回答が必要な場合は、

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」の 2 つのインスタンスに異なる名前を使用することもできます (この場合、「inv.」プレフィックスを削除できます)。

于 2013-01-11T09:58:11.040 に答える