首页 > 解决方案 > MS Access - 如何使用 3 个变量进行排名

问题描述

我正在尝试使用以下示例数据中的 3 个变量进行排名:

+-------------+---------+------+------ --+
| 案例编号 | 文件类型 | 文件编号 | 排名 |
+-------------+---------+------+------ --+
| 1 | 一个 | 3787104 | 1 |
| 1 | 乙| 3786773 | 2 |
| 2 | 一个 | 3787505 | 1 |
| 3 | 一个 | 3787525 | 1 |
| 3 | 乙| 3786892 | 3 |
| 3 | 一个 | 3786891 | 2 |
| 4 | 乙| 3787514 | 3 |
| 4 | 乙| 3787513 | 2 |
| 4 | 一个 | 3787512 | 1 |
| 5 | 一个 | 3786436 | 6 |
| 5 | 一个 | 3786499 | 5 |
| 5 | 一个 | 3786456 | 4 |
| 5 | 一个 | 3786371 | 3 |
| 5 | 一个 | 3786481 | 2 |
| 6 | 一个 | 3786815 | 1 |
| 7 | 乙| 3786998 | 3 |
| 7 | 乙| 3786989 | 2 |
| 7 | 一个 | 3786988 | 1 |
| 8 | 乙| 3787033 | 4 |
| 8 | 一个 | 3787078 | 2 |
| 8 | 乙| 3787037 | 3 |
| 8 | 一个 | 3787074 | 1 |
+-------------+---------+------+------ --+

首先按组排序,然后按文档类型,然后按文档编号。这是我在浏览了这里的一些条目后目前所拥有的:

SELECT [Case Number], [Doc Type], [Document Number], (
  SELECT  COUNT(*)  from [Document Tracker] AS tbl2 WHERE
(
   tbl1.[Doc Type] < tbl2.[Doc Type] AND
   tbl1.[Case Number] = tbl2.[Case Number] 
)
)
+1 AS Rank
FROM [Document Tracker] AS tbl1
ORDER BY [Case Number], [Doc Type] DESC , [Document Number];

这给了我这个输出:

+-------------+---------+------+------ --+
| 案例编号 | 文件类型 | 文件编号 | 排名 |
+-------------+---------+------+------ --+
| 1 | 一个 | 3787104 | 1 |
| 1 | 乙| 3786773 | 2 |
| 2 | 一个 | 3787505 | 1 |
| 3 | 一个 | 3787525 | 1 |
| 3 | 乙| 3786892 | 3 |
| 3 | 一个 | 3786891 | 1 |
| 4 | 乙| 3787514 | 3 |
| 4 | 乙| 3787513 | 3 |
| 4 | 一个 | 3787512 | 1 |
| 5 | 一个 | 3786436 | 1 |
| 5 | 一个 | 3786499 | 1 |
| 5 | 一个 | 3786456 | 1 |
| 5 | 一个 | 3786371 | 1 |
| 5 | 一个 | 3786481 | 1 |
| 6 | 一个 | 3786815 | 1 |
| 7 | 乙| 3786998 | 2 |
| 7 | 乙| 3786989 | 2 |
| 7 | 一个 | 3786988 | 1 |
| 8 | 乙| 3787033 | 3 |
| 8 | 一个 | 3787078 | 1 |
| 8 | 乙| 3787037 | 3 |
| 8 | 一个 | 3787074 | 1 |
+-------------+---------+------+------ --+

我无法弄清楚缺少的代码也可以对其文档编号进行排名。我很感激这方面的任何帮助。

标签: sqlms-access

解决方案


在过滤和排序中需要做一个小的调整:

SELECT 
    [Case Number], 
    [Doc Type], 
    [Document Number], 
        (SELECT 
            COUNT(*) 
        FROM 
            [Document Tracker] AS tbl2 
        WHERE
            tbl1.[Doc Type] & CStr(tbl1.[Document Number]) > tbl2.[Doc Type] & CStr(tbl2.[Document Number]) 
            AND
            tbl1.[Case Number] = tbl2.[Case Number]) + 1 AS Rank
FROM 
    [Document Tracker] AS tbl1
ORDER BY 
    [Case Number], 
    [Doc Type] DESC, 
    [Document Number] DESC;

推荐阅读