SQL 按列对结果进行分组,然后将最多的实例排序为最少的

SQL Group results by column then order most instances to least

我需要 return 所有 m_id 其中 cli_id 有假 cli_billstat。然后我需要按 cli_id 的最大数量排序到最少数量。

我的查询 return 是我需要的信息,但我无法按我想要的方式 cli_id 获取它。

我的代码:

SELECT CLIENT.CLI_ID, CLI_FNAME, CLI_LNAME, CLI_BILLSTAT, M_ID, M_DATE
FROM CLIENT, MEETING
WHERE CLIENT.CLI_ID = MEETING.CLI_ID
     AND CLI_BILLSTAT = False
GROUP BY CLIENT.CLI_ID, CLI_FNAME, CLI_LNAME, CLI_BILLSTAT, M_ID, M_DATE\\

in the cli_id column it returns
cli_id
10
10
14
21
21
21

what I need is something like:
cli_id
21
21
21
10
10
14
22

我试过添加 COUNT(client.cli_id) AS COUNT,然后按 COUNT ORDER BY COUNT,但它没有改变结果。

你必须使用子查询,本质上是重复连接查询,如下:

select 
    S1.CLI_ID,
    S1.CLI_FNAME,
    S1.CLI_LNAME, 
    S1.CLI_BILLSTAT, 
    S1.M_ID,
    S1.M_DATE,
    S1.Cnt
from 
  (SELECT ClntA.CLI_ID,
          ClntA.CLI_FNAME,
          ClntA.CLI_LNAME, 
          ClntA.CLI_BILLSTAT, 
          MtgA.M_ID,
          MtgA.M_DATE,
         (select count(*) 
          from CLIENT ClntB 
               Inner Join 
               MEETING MtgB 
               on ClntB.CLI_ID = MtgB.CLI_ID
          WHERE ClntB.CLI_BILLSTAT = False
             AND ClntB.cli_id=ClntA.cli_id) as Cnt
   FROM
        CLIENT ClntA 
        Inner Join 
        MEETING MtgA 
        on ClntA.CLI_ID = MtgA.CLI_ID
   WHERE ClntA.CLI_BILLSTAT = False
 ) S1
order by S1.cnt desc, S1.cli_id;

在大多数其他现代 dbms 产品中,这可以通过窗口函数实现,但 MsAccess SQL 缺少它们。

如果 CLI_ID 是 CLIENT table 的主键,您可以显着缩短子查询。如果是这种情况,子查询只能计算来自 MEETING with MtgB.CLI_ID=ClntA.CLI_ID 的记录(子查询中不需要 JOIN 或 WHERE CLI_BILLSTAT)