我需要返回所有m_id,在cli_id有假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,然后按COUNT排序,但是它不会改变结果。
发布于 2022-04-25 12:13:30
您必须使用子查询,实质上重复连接查询,如下所示:
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是客户端表的主键,则可以大大缩短子查询。如果是这样的话,子查询只能计数与MtgB.CLI_ID=ClntA.CLI_ID会面的记录(不需要连接或子查询中的CLI_BILLSTAT )。
https://stackoverflow.com/questions/71993504
复制相似问题