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



我需要返回所有m_id,其中cli_id有false cli_billstat。然后我需要按cli_id的最大计数排序到最小。

我的查询返回我需要的信息,但我不能得到它的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)作为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表的主键,可以显著缩短子查询。如果是这种情况,子查询只能计数来自MEETING的MtgB.CLI_ID=ClntA的记录。CLI_ID(在子查询中不需要JOIN或WHERE CLI_BILLSTAT)

相关内容

最新更新