【问题标题】:How to use "COUNT" with "GROUP BY" & "WHERE"如何将“COUNT”与“GROUP BY”和“WHERE”一起使用
【发布时间】:2014-09-13 18:53:42
【问题描述】:
SELECT `loanac`.`id`, `loanac`.`area`
FROM loanac, loantrans
WHERE `loanac`.`lacc`=`loantrans`.`account`
GROUP BY `loanac`.`lacc`
HAVING SUM(IFNULL(`loantrans`.`out`,0)) > SUM(IFNULL(`loantrans`.`in`,0))

查询结果:

----------------------------------------
id      area
----------------------------------------
5       A
165     C
166     C
167     C
232     D
91      B

这个查询给了我所有的 id & area for lacc's who have out> in,这个查询是 OK 和工作的,我只需要从这个查询中得到输出 GROUP BY area 和 COUNT id。有人可以帮忙吗?

我想要的是

----------------------------------------
COUNT(id)      GROUP BY(area)
----------------------------------------
1               A
5               B
9               C
1               D

注意:条件不变 目标:要查找/计数(loanac.id)分组的数量(loanac.area)具有相同的条件

【问题讨论】:

  • FROM loanac INNER JOIN loantrans ON loanac.lacc=loantrans.account 不要使用老式的连接语法

标签: mysql sql count group-by


【解决方案1】:

我认为这可以满足您的要求:

SELECT COUNT(id), area FROM
  (SELECT id, area FROM loanac
     JOIN loantrans ON loanac.lacc = loantrans.account
     GROUP BY loanac.lacc
     HAVING SUM(IFNULL(loantrans.out, 0)) > SUM(IFNULL(loantrans.in,0))) t
  GROUP BY area;

在上面,我有一个由loanac.area 组成的组,因为这就是原始示例的样子。如果要按loanac.lacc 分组,只需将上面的GROUP BY 更改为GROUP BY loanac.lacc

编辑:加载评论中链接的测试数据库并运行查询:

+-----------+------+
| COUNT(id) | area |
+-----------+------+
|        86 | A    |
|        81 | B    |
|        64 | C    |
|        66 | D    |
|        20 | E    |
|         3 | F    |
+-----------+------+

【讨论】:

  • 兄弟,按照您的指示进行了尝试,但是,此查询未保持此条件“HAVING SUM(loantrans.out) > SUM(loantrans.in)”。有什么建议吗?
  • @Machine 我更新了我的答案并插入了IFNULL。我不确定没有它是否可以工作。看看能不能解决。
  • 兄弟,现在不是按 id 分组,我需要先按 id 分组,然后按区域。这是我为您上传的数据库,请您看一下。 dropbox.com/s/or8hf4rza2ut736/bankdb.sql_4.zip?dl=0
  • @Machine 在这种情况下,“按 id 分组”是什么意思? id 没有出现在您的示例中,因为您只是显示每个区域的多个不同 ID 的计数。您的示例显示按区域分组和排序。或许你可以举一个更具说明性的例子。
  • 兄弟,请查看这里上传的截图dropbox.com/s/zcsuxn8gxd8gp37/Capture.PNG?dl=0
【解决方案2】:

我想你想要这样的东西。将area 添加到您的 GROUP BY 行,并使用 COUNT(id) 获取交易计数。

选择计数(`loanac`.`id`), SUM(IFNULL(`loantrans`.`out`,0)) 作为转出, SUM(IFNULL(`loantrans`.`in`,0)) 作为转入, `loanac`.`面积`, `loanac`.`lacc` 来自loanac,loantrans WHERE `loanac`.`lacc`=`loantrans`.`account` GROUP BY `loanac`.`lacc`,`loanac`.`area` 有转出>转入

编辑:提供您正在寻找的输出

选择计数(loanac.id),`loanac`.`area` 来自loanac,loantrans WHERE `loanac`.`lacc`=`loantrans`.`account` GROUP BY `loanac`.`lacc`,`loanac`.`area` HAVING SUM(IFNULL(`loantrans`.`out`,0)) > SUM(IFNULL(`loantrans`.`in`,0))

【讨论】:

  • 我觉得我说的不够清楚,无法理解,信息已更新。请您再看一下并提出任何建议吗?
  • 兄弟,按照你的指示试过了,但是区域没有分组。这是为您上传的数据库。请你看一下。 dropbox.com/s/gz8f4ejvbgxehbp/bankdb.sql_2.zip?dl=0
猜你喜欢
  • 1970-01-01
  • 2016-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-15
  • 1970-01-01
相关资源
最近更新 更多