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)
我需要 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)