GROUP BY不会返回每个特定字段的所有行

时间:2014-03-28 14:35:53

标签: mysql sql

考虑数据库:

帐户表

enter image description here

记录:

enter image description here

客户表

enter image description here

记录:

enter image description here

我想得到所有客户的名字和id,在客户ID组织的Overdraft中,所以:

SELECT c.Client_id_number , a.Account_number ,  c.firstName_client , c.lastName_Client , a.Account_balance
FROM Clients AS c 
INNER JOIN Accounts AS a
ON a.Client_id_number = c.Client_id_number
WHERE a.Account_balance < 0
GROUP BY c.Client_id_number;

但是这回来了

enter image description here

表示客户1234帐号为84,余额-4000未出现...我哪里出错了?

3 个答案:

答案 0 :(得分:1)

您只按client_id_number进行分组,这意味着每个客户ID只能获得一行。

您需要按分组输出中要唯一的行集。在这种情况下,这可能意味着:

GROUP BY c.Client_id_number, a.account_number

然后,您应该将聚合函数应用于不属于分组的任何列,例如sum(account_balance)

如果您没有使用任何汇总功能,则表明您实际上并不需要分组。

在大多数数据库中,选择任何不在group by语句中的列是错误的,但是MySQL&#34;有帮助地&#34;允许这种查询。它不是返回错误,而是隐藏问题并随机选择剩余列的可能值。

答案 1 :(得分:1)

GROUP BY语句与聚合函数(例如SUM)一起使用,以按一列或多列对结果集进行分组。 如果没有进行任何聚合,则使用ORDER BY

答案 2 :(得分:1)

更新:首先,我应该明确以下内容,您不需要使用&#34;组来&#34;因为您没有总结,所以您的查询应该是:

SELECT c.Client_id_number , a.Account_number ,  c.firstName_client , c.lastName_Client , a.Account_balance
FROM Clients AS c 
INNER JOIN Accounts AS a
ON a.Client_id_number = c.Client_id_number
WHERE a.Account_balance < 0

我注意到你在&#34;组中遇到问题&#34;概念,所以重要的是你知道你需要按照&#34; SELECT&#34;中的每个字段进行分组。除了你总结的那些(c.Client_id_number,a.Account_number)

所以,即

SELECT c.Client_id_number , a.Account_number,  sum(a.Account_balance) as balance
FROM Clients AS c 
INNER JOIN Accounts AS a
ON a.Client_id_number = c.Client_id_number
WHERE a.Account_balance < 0
GROUP BY c.Client_id_number, a.Account_number;